diff --git a/examples/snake/src/main.cpp b/examples/snake/src/main.cpp index 6be8510..5b99119 100644 --- a/examples/snake/src/main.cpp +++ b/examples/snake/src/main.cpp @@ -302,7 +302,7 @@ int main(int argc, char *argv[]) { auto snake_food = std::make_shared(window_size, snake_player); game.AddEvent(new simpleengine::EntityEvent(game.GetWindow(), snake_food)); game.AddEvent(new simpleengine::EntityEvent(game.GetWindow(), snake_player)); - game.AddEvent(new simpleengine::CollisionHandler(game.GetWindow(), { snake_player, snake_food } )); + game.AddEvent(new simpleengine::CollisionHandler(game)); return game.Run(); } \ No newline at end of file diff --git a/include/simpleengine/events/collision_handler.h b/include/simpleengine/events/collision_handler.h index 69d6eb7..953e6ab 100644 --- a/include/simpleengine/events/collision_handler.h +++ b/include/simpleengine/events/collision_handler.h @@ -11,16 +11,20 @@ #include "../entity.h" namespace simpleengine { + class Game; class CollisionHandler : public Event { public: - explicit CollisionHandler(sf::RenderWindow* window, std::vector> entities) : simpleengine::Event(window), entities(entities) { + explicit CollisionHandler(simpleengine::Game& game) : simpleengine::Event(nullptr), game(game) { } void Update(const float& delta_time) override; void Render(sf::RenderTarget* target) override { } + + void UpdateHandledEntities(); private: - std::vector> entities; + std::vector> handled_entities; + simpleengine::Game& game; }; } diff --git a/include/simpleengine/game.h b/include/simpleengine/game.h index cd6ba1e..3559bda 100644 --- a/include/simpleengine/game.h +++ b/include/simpleengine/game.h @@ -16,12 +16,15 @@ #include #include "entity.h" +#include "events/collision_handler.h" namespace simpleengine { class Event; class Game { public: + friend class CollisionHandler; + Game(int w, int h, const std::string& window_name); Game(const sf::Vector2u& window_size, const std::string& window_name); virtual ~Game(); diff --git a/src/events/collision_handler.cpp b/src/events/collision_handler.cpp index 2021804..73f224f 100644 --- a/src/events/collision_handler.cpp +++ b/src/events/collision_handler.cpp @@ -6,13 +6,34 @@ #include "events/collision_handler.h" #include "components/collision_component.h" +#include "entity.h" +#include "events/entity_event.h" +#include "game.h" + +#include void simpleengine::CollisionHandler::Update(const float& delta_time) { - for (std::shared_ptr entity : entities) { + // Update list of handled entities. + handled_entities.erase(std::remove_if(handled_entities.begin(), handled_entities.end(), + [](std::shared_ptr ptr) { return ptr == nullptr; }), handled_entities.end()); + + for (simpleengine::Event* event : game.events) { + auto* entity_event = dynamic_cast(event); + + if (entity_event) { + std::shared_ptr entity = entity_event->GetEntity(); + if (std::count(handled_entities.begin(), handled_entities.end(), entity) == 0) { + handled_entities.push_back(entity); + } + } + } + + // Check for collisions in all entities. + for (std::shared_ptr entity : handled_entities) { std::shared_ptr entity_col = entity->GetComponent(); if (entity_col) { - for (std::shared_ptr two : entities) { + for (std::shared_ptr two : handled_entities) { if (two == entity) continue; std::shared_ptr two_col = two->GetComponent();