diff --git a/cpp/src/entities.hpp b/cpp/src/entities.hpp index 587f36d..6ad8521 100644 --- a/cpp/src/entities.hpp +++ b/cpp/src/entities.hpp @@ -67,6 +67,10 @@ public: bool IsCollisionBoxVisible() const { return m_CollisionBoxVisible; } + void Select() { m_Selected = true; } + void Deselect() { m_Selected = false; } + bool IsSelected() const { return m_Selected; } + protected: WorldPos m_Position; WorldPos m_ActualVelocity; @@ -76,6 +80,7 @@ protected: private: bool m_FlagExpired = false; bool m_CollisionBoxVisible = true; + bool m_Selected = false; }; class Player final : public Entity { diff --git a/cpp/src/gameloop.cpp b/cpp/src/gameloop.cpp index 81aad3e..7944493 100644 --- a/cpp/src/gameloop.cpp +++ b/cpp/src/gameloop.cpp @@ -50,7 +50,12 @@ void GameLoop::Draw() { if (entity->IsCollisionBoxVisible()) { float collision_radius = camera.WorldToWindowSize(entity->GetCollisionRadius()); - m_Window->DrawCircle(entity_pos, collision_radius); + m_Window->DrawCircle(entity_pos, collision_radius, 255, 0, 0); + } + if (entity->IsSelected()) + { + float collision_radius = camera.WorldToWindowSize(entity->GetCollisionRadius()); + m_Window->DrawCircle(entity_pos, collision_radius, 0, 255, 0); } } diff --git a/cpp/src/pathfindingdemo.cpp b/cpp/src/pathfindingdemo.cpp index 47631cd..7d8cd50 100644 --- a/cpp/src/pathfindingdemo.cpp +++ b/cpp/src/pathfindingdemo.cpp @@ -229,10 +229,21 @@ void PathFindingDemo::HandleActions(const std::vector &actions) }; } +void PathFindingDemo::DeselectEntities() +{ + std::for_each(m_SelectedEntities.begin(), m_SelectedEntities.end(), [](auto& x) + { + if (auto entity = x.lock()) + entity->Deselect(); + } + ); + m_SelectedEntities.clear(); +} + void PathFindingDemo::SelectEntitiesInRectangle(WorldPos A, WorldPos B) { + DeselectEntities(); // TODO use colliders for this - m_SelectedEntities.clear(); auto [x_min, x_max] = std::minmax(A.x(), B.x()); auto [y_min, y_max] = std::minmax(A.y(), B.y()); for (const auto& entity : m_Entities) @@ -243,6 +254,7 @@ void PathFindingDemo::SelectEntitiesInRectangle(WorldPos A, WorldPos B) if (x_in_range && y_in_range) { m_SelectedEntities.push_back(std::weak_ptr(entity)); + entity->Select(); } } LOG_INFO("Selected ", m_SelectedEntities.size(), " entities"); diff --git a/cpp/src/pathfindingdemo.hpp b/cpp/src/pathfindingdemo.hpp index b327c8f..2f3eb4c 100644 --- a/cpp/src/pathfindingdemo.hpp +++ b/cpp/src/pathfindingdemo.hpp @@ -43,8 +43,10 @@ public: WorldPos GetRandomPosition() const; void SelectEntitiesInRectangle(WorldPos A, WorldPos B); + void DeselectEntities(); bool IsSelectionBoxActive() const { return m_SelectionBox.active; } std::pair GetSelectionBoxPosSize(); + std::vector> GetSelectedEntities() { return m_SelectedEntities; } private: const std::vector& GetEntityCollisions(); diff --git a/cpp/src/window.cpp b/cpp/src/window.cpp index 3a60fc4..f92bfcc 100644 --- a/cpp/src/window.cpp +++ b/cpp/src/window.cpp @@ -104,10 +104,11 @@ void Window::ClearWindow() { void Window::Flush() { SDL_RenderPresent(m_Renderer.get()); } -void Window::DrawCircle(const WindowPos &position, float radius) { +// TODO use some struct for color +void Window::DrawCircle(const WindowPos &position, float radius, uint8_t R, uint8_t G, uint8_t B) { int cx = static_cast(position.x()); int cy = static_cast(position.y()); - SDL_SetRenderDrawColor(m_Renderer.get(), 255, 0, 0, 255); + SDL_SetRenderDrawColor(m_Renderer.get(), R, G, B, 255); for (int i = 0; i < 360; ++i) { double a = i * M_PI / 180.0; SDL_RenderPoint(m_Renderer.get(), diff --git a/cpp/src/window.hpp b/cpp/src/window.hpp index 49391c5..0729bd4 100644 --- a/cpp/src/window.hpp +++ b/cpp/src/window.hpp @@ -28,7 +28,7 @@ public: void DrawRect(const WindowPos &position, const WindowSize size, uint8_t R, uint8_t G, uint8_t B); void ClearWindow(); void Flush(); - void DrawCircle(const WindowPos &position, float radius); + void DrawCircle(const WindowPos &position, float radius, uint8_t R, uint8_t G, uint8_t B); void DrawLine(const WindowPos &A, const WindowPos &B); private: