Very simple CollisionSystem made, 'Z','Y' to toggle on/off.

This commit is contained in:
William Moberg
2015-12-15 15:36:28 +01:00
parent 170610bcb1
commit e2417be8c7
5 changed files with 46 additions and 12 deletions
+3 -2
View File
@@ -14,15 +14,16 @@ class CollisionSystem : public System
public: public:
CollisionSystem(EventBroker* eventBroker) CollisionSystem(EventBroker* eventBroker)
: System(eventBroker, "AABB") : System(eventBroker, "AABB")
, zPress(false)
{ {
//TODO: Debug stuff, remove later. //TODO: Debug stuff, remove later.
EVENT_SUBSCRIBE_MEMBER(m_EKeyUp, &CollisionSystem::OnKeyUp); EVENT_SUBSCRIBE_MEMBER(m_EKeyUp, &CollisionSystem::OnKeyUp);
} }
virtual void Update(World* world, ComponentWrapper& collision, double dt) override; virtual void Update(World* world, ComponentWrapper& cAABB, double dt) override;
private: private:
bool zPress;
EventRelay<CollisionSystem, Events::KeyUp> m_EKeyUp; EventRelay<CollisionSystem, Events::KeyUp> m_EKeyUp;
bool OnKeyUp(const Events::KeyUp &event); bool OnKeyUp(const Events::KeyUp &event);
}; };
+4 -3
View File
@@ -14,23 +14,24 @@
<Components> <Components>
<c:Transform> <c:Transform>
<Position X="-1.5"/> <Position X="-1.5"/>
<Scale X="2" Y="2" Z="2"/> <Scale X="1" Y="1" Z="1"/>
</c:Transform> </c:Transform>
<c:Model> <c:Model>
<Resource>Models/ScaleWidget.obj</Resource> <Resource>Models/ScaleWidget.obj</Resource>
</c:Model> </c:Model>
<c:Trigger>
</c:Trigger>
</Components> </Components>
</Entity> </Entity>
<Entity> <Entity>
<Components> <Components>
<c:Transform> <c:Transform>
<Position X="1.5"/> <Position X="1.5"/>
<Scale X="2" Y="2" Z="2"/>
</c:Transform> </c:Transform>
<c:Model> <c:Model>
<Resource>Models/RotationWidget.obj</Resource> <Resource>Models/RotationWidget.obj</Resource>
</c:Model> </c:Model>
<c:Trigger>
</c:Trigger>
</Components> </Components>
</Entity> </Entity>
<Entity> <Entity>
+34 -4
View File
@@ -1,16 +1,46 @@
#include "Collision/Collision.h"
#include "Collision/CollisionSystem.h" #include "Collision/CollisionSystem.h"
#include "Core/AABB.h"
void CollisionSystem::Update(World * world, ComponentWrapper & cAABB, double dt)
void CollisionSystem::Update(World * world, ComponentWrapper & collision, double dt)
{ {
//cAABB is any entity that should be collideable.
m_EventBroker->Process<CollisionSystem>(); m_EventBroker->Process<CollisionSystem>();
(glm::vec3&)collision["Center"] = (glm::vec3)world->GetComponent(collision.EntityID, "Transform")["Position"]; //Currently the box is translated according to the models Transform matrix,
//but not scaled (or rotated since it's AABB). This should be fine, if we don't
//want to shrink or scale up an collideable object after creation.
cAABB["BoxCenter"] = (glm::vec3)world->GetComponent(cAABB.EntityID, "Transform")["Position"];
AABB thisBox;
thisBox.CreateFromCenter(cAABB["BoxCenter"], cAABB["BoxSize"]);
//Here c should be an object that moves, currently only players.
if (zPress) {
return;
}
for (auto& mover : *world->GetComponents("Player")) {
if (cAABB.EntityID == mover.EntityID) {
continue;
}
AABB otherBox;
ComponentWrapper& aabbComp = world->GetComponent(mover.EntityID, "AABB");
otherBox.CreateFromCenter(aabbComp["BoxCenter"], aabbComp["BoxSize"]);
if (Collision::AABBVsAABB(thisBox, otherBox)) {
ComponentWrapper& trans = world->GetComponent(mover.EntityID, "Transform");
//TODO: Move entity to correct position on collision instead of this. Special treatment if both are movers.
glm::vec3 newPos = trans["Position"];
float moveSpeed = 0.12f;
newPos += moveSpeed * glm::normalize(newPos - thisBox.Center());
trans["Position"] = newPos;
aabbComp["BoxCenter"] = newPos;
}
}
} }
bool CollisionSystem::OnKeyUp(const Events::KeyUp & event) bool CollisionSystem::OnKeyUp(const Events::KeyUp & event)
{ {
if (event.KeyCode == GLFW_KEY_Z) { if (event.KeyCode == GLFW_KEY_Z) {
zPress = true;
} else if (event.KeyCode == GLFW_KEY_X) {
zPress = false;
} }
return false; return false;
} }
+2
View File
@@ -1,5 +1,6 @@
#include "Game.h" #include "Game.h"
#include "Collision/TriggerSystem.h" #include "Collision/TriggerSystem.h"
#include "Collision/CollisionSystem.h"
Game::Game(int argc, char* argv[]) Game::Game(int argc, char* argv[])
{ {
@@ -47,6 +48,7 @@ Game::Game(int argc, char* argv[])
m_SystemPipeline = new SystemPipeline(m_EventBroker); m_SystemPipeline = new SystemPipeline(m_EventBroker);
m_SystemPipeline->AddSystem<RaptorCopterSystem>(); m_SystemPipeline->AddSystem<RaptorCopterSystem>();
m_SystemPipeline->AddSystem<PlayerSystem>(); m_SystemPipeline->AddSystem<PlayerSystem>();
m_SystemPipeline->AddSystem<CollisionSystem>();
m_SystemPipeline->AddSystem<TriggerSystem>(); m_SystemPipeline->AddSystem<TriggerSystem>();
m_LastTime = glfwGetTime(); m_LastTime = glfwGetTime();
+3 -3
View File
@@ -59,18 +59,18 @@ bool PlayerSystem::OnKeyUp(const Events::KeyUp & event)
bool PlayerSystem::OnTouch(const Events::TriggerTouch &event) bool PlayerSystem::OnTouch(const Events::TriggerTouch &event)
{ {
LOG_INFO("Player %i touched widget (entity %i).", event.Entity, event.Trigger); LOG_INFO("Player entity %i touched widget (entity %i).", event.Entity, event.Trigger);
return false; return false;
} }
bool PlayerSystem::OnEnter(const Events::TriggerEnter &event) bool PlayerSystem::OnEnter(const Events::TriggerEnter &event)
{ {
LOG_INFO("Player %i entered widget (entity %i).", event.Entity, event.Trigger); LOG_INFO("Player entity %i entered widget (entity %i).", event.Entity, event.Trigger);
return false; return false;
} }
bool PlayerSystem::OnLeave(const Events::TriggerLeave &event) bool PlayerSystem::OnLeave(const Events::TriggerLeave &event)
{ {
LOG_INFO("Player %i left widget (entity %i).", event.Entity, event.Trigger); LOG_INFO("Player entity %i left widget (entity %i).", event.Entity, event.Trigger);
return false; return false;
} }