Very simple CollisionSystem made, 'Z','Y' to toggle on/off.
This commit is contained in:
@@ -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);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user