Deselect all entities on re-selection

This commit is contained in:
Jan Mrna 2025-10-12 16:44:59 +02:00
parent df6d323e42
commit 2f346c11c3
6 changed files with 30 additions and 5 deletions

View File

@ -67,6 +67,10 @@ public:
bool IsCollisionBoxVisible() const { return m_CollisionBoxVisible; } bool IsCollisionBoxVisible() const { return m_CollisionBoxVisible; }
void Select() { m_Selected = true; }
void Deselect() { m_Selected = false; }
bool IsSelected() const { return m_Selected; }
protected: protected:
WorldPos m_Position; WorldPos m_Position;
WorldPos m_ActualVelocity; WorldPos m_ActualVelocity;
@ -76,6 +80,7 @@ protected:
private: private:
bool m_FlagExpired = false; bool m_FlagExpired = false;
bool m_CollisionBoxVisible = true; bool m_CollisionBoxVisible = true;
bool m_Selected = false;
}; };
class Player final : public Entity { class Player final : public Entity {

View File

@ -50,7 +50,12 @@ void GameLoop::Draw() {
if (entity->IsCollisionBoxVisible()) if (entity->IsCollisionBoxVisible())
{ {
float collision_radius = camera.WorldToWindowSize(entity->GetCollisionRadius()); 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);
} }
} }

View File

@ -229,10 +229,21 @@ void PathFindingDemo::HandleActions(const std::vector<UserAction> &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) void PathFindingDemo::SelectEntitiesInRectangle(WorldPos A, WorldPos B)
{ {
DeselectEntities();
// TODO use colliders for this // TODO use colliders for this
m_SelectedEntities.clear();
auto [x_min, x_max] = std::minmax(A.x(), B.x()); auto [x_min, x_max] = std::minmax(A.x(), B.x());
auto [y_min, y_max] = std::minmax(A.y(), B.y()); auto [y_min, y_max] = std::minmax(A.y(), B.y());
for (const auto& entity : m_Entities) for (const auto& entity : m_Entities)
@ -243,6 +254,7 @@ void PathFindingDemo::SelectEntitiesInRectangle(WorldPos A, WorldPos B)
if (x_in_range && y_in_range) if (x_in_range && y_in_range)
{ {
m_SelectedEntities.push_back(std::weak_ptr(entity)); m_SelectedEntities.push_back(std::weak_ptr(entity));
entity->Select();
} }
} }
LOG_INFO("Selected ", m_SelectedEntities.size(), " entities"); LOG_INFO("Selected ", m_SelectedEntities.size(), " entities");

View File

@ -43,8 +43,10 @@ public:
WorldPos GetRandomPosition() const; WorldPos GetRandomPosition() const;
void SelectEntitiesInRectangle(WorldPos A, WorldPos B); void SelectEntitiesInRectangle(WorldPos A, WorldPos B);
void DeselectEntities();
bool IsSelectionBoxActive() const { return m_SelectionBox.active; } bool IsSelectionBoxActive() const { return m_SelectionBox.active; }
std::pair<WindowPos, WindowSize> GetSelectionBoxPosSize(); std::pair<WindowPos, WindowSize> GetSelectionBoxPosSize();
std::vector<std::weak_ptr<Entity>> GetSelectedEntities() { return m_SelectedEntities; }
private: private:
const std::vector<Collision>& GetEntityCollisions(); const std::vector<Collision>& GetEntityCollisions();

View File

@ -104,10 +104,11 @@ void Window::ClearWindow() {
void Window::Flush() { SDL_RenderPresent(m_Renderer.get()); } 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<int>(position.x()); int cx = static_cast<int>(position.x());
int cy = static_cast<int>(position.y()); int cy = static_cast<int>(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) { for (int i = 0; i < 360; ++i) {
double a = i * M_PI / 180.0; double a = i * M_PI / 180.0;
SDL_RenderPoint(m_Renderer.get(), SDL_RenderPoint(m_Renderer.get(),

View File

@ -28,7 +28,7 @@ public:
void DrawRect(const WindowPos &position, const WindowSize size, uint8_t R, uint8_t G, uint8_t B); void DrawRect(const WindowPos &position, const WindowSize size, uint8_t R, uint8_t G, uint8_t B);
void ClearWindow(); void ClearWindow();
void Flush(); 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); void DrawLine(const WindowPos &A, const WindowPos &B);
private: private: