From f875f7832fd276d6686587f9afdb07e84dbbab53 Mon Sep 17 00:00:00 2001 From: Peter Siegmund Date: Mon, 9 Jun 2025 22:36:56 +0200 Subject: [PATCH] implement onTap and remove memory leaks Signed-off-by: Peter Siegmund --- src/ui/Device.cpp | 6 +----- src/ui/widgets/Button.cpp | 10 +++++----- src/ui/widgets/D_Pad.cpp | 42 +++++++++++++++++++++++++++++++++------ src/ui/widgets/D_Pad.h | 1 + 4 files changed, 43 insertions(+), 16 deletions(-) diff --git a/src/ui/Device.cpp b/src/ui/Device.cpp index 2de10e3..a9e0472 100644 --- a/src/ui/Device.cpp +++ b/src/ui/Device.cpp @@ -231,11 +231,7 @@ void Device::ReleaseTap(const SDL_MouseButtonEvent *event) const for (const auto &child : m_children) { - if (child->IsHit(static_cast(event->x), static_cast(event->y))) - { - child->ReleaseTap(static_cast(event->x), static_cast(event->y)); - break; - } + child->ReleaseTap(static_cast(event->x), static_cast(event->y)); } } diff --git a/src/ui/widgets/Button.cpp b/src/ui/widgets/Button.cpp index f7462ce..cf90a96 100644 --- a/src/ui/widgets/Button.cpp +++ b/src/ui/widgets/Button.cpp @@ -4,8 +4,6 @@ #include #include -auto pressed = false; - Button::Button(void *appState, const float x, const float y, const float width, std::function callback) : UIWidget(appState), m_x(x), m_y(y), m_width(width), m_callback(std::move(callback)) { @@ -15,14 +13,16 @@ void Button::Render() const { const auto button = ResourceManager::Instance().GetTextureByName(GetContext()->MainRenderer(), "button_normal.png"); - const auto overlay = - ResourceManager::Instance().GetTextureByName(GetContext()->MainRenderer(), "button_pressed_overlay.png"); - const auto dst = SDL_FRect(m_x, m_y, m_width, m_width); SDL_RenderTexture(GetContext()->MainRenderer(), button, nullptr, &dst); + SDL_DestroyTexture(button); + if (m_isPressed) { + const auto overlay = + ResourceManager::Instance().GetTextureByName(GetContext()->MainRenderer(), "button_pressed_overlay.png"); SDL_RenderTexture(GetContext()->MainRenderer(), overlay, nullptr, &dst); + SDL_DestroyTexture(overlay); } } diff --git a/src/ui/widgets/D_Pad.cpp b/src/ui/widgets/D_Pad.cpp index 4a8c886..d50025a 100644 --- a/src/ui/widgets/D_Pad.cpp +++ b/src/ui/widgets/D_Pad.cpp @@ -13,8 +13,38 @@ void D_Pad::Render() const const auto dPad = ResourceManager::Instance().GetTextureByName(GetContext()->MainRenderer(), "d-pad_normal.png"); - const auto dst = SDL_FRect(m_x, m_y, m_width, m_width); + auto dst = SDL_FRect(m_x, m_y, m_width, m_width); SDL_RenderTexture(GetContext()->MainRenderer(), dPad, nullptr, &dst); + SDL_DestroyTexture(dPad); + + if (m_isPressed != Direction::NONE) + { + const auto overlay = + ResourceManager::Instance().GetTextureByName(GetContext()->MainRenderer(), "button_pressed_overlay.png"); + switch (m_isPressed) + { + case Direction::UP: + dst = SDL_FRect(m_x + m_width / 3.0f, m_y, m_width / 3.0f, m_width / 3.0f); + break; + + case Direction::DOWN: + dst = SDL_FRect(m_x + m_width / 3.0f, m_y + 2 * m_width / 3.0f, m_width / 3.0f, m_width / 3.0f); + break; + + case Direction::LEFT: + dst = SDL_FRect(m_x, m_y + m_width / 3.0f, m_width / 3.0f, m_width / 3.0f); + break; + + case Direction::RIGHT: + dst = SDL_FRect(m_x + 2 * m_width / 3.0f, m_y + m_width / 3.0f, m_width / 3.0f, m_width / 3.0f); + break; + + case Direction::NONE: + break; + } + SDL_RenderTexture(GetContext()->MainRenderer(), overlay, nullptr, &dst); + SDL_DestroyTexture(overlay); + } } bool D_Pad::IsHit(const int mouse_x, const int mouse_y) const @@ -66,17 +96,17 @@ void D_Pad::OnTap(const int mouse_x, const int mouse_y) if (m_callback) { const auto local_x = static_cast(mouse_x) - m_x; - const auto local_y = static_cast(mouse_y) - m_y; - if (local_x >= 0 && local_x <= m_width && local_y >= 0 && local_y <= m_width) + if (const auto local_y = static_cast(mouse_y) - m_y; + local_x >= 0 && local_x <= m_width && local_y >= 0 && local_y <= m_width) { - const auto dir = GetDirectionFromTap(local_x, local_y); - m_callback(dir); + m_isPressed = GetDirectionFromTap(local_x, local_y); + m_callback(m_isPressed); } } } void D_Pad::ReleaseTap(const int mouse_x, const int mouse_y) { - /// + m_isPressed = Direction::NONE; } \ No newline at end of file diff --git a/src/ui/widgets/D_Pad.h b/src/ui/widgets/D_Pad.h index acbdfd9..16a707f 100644 --- a/src/ui/widgets/D_Pad.h +++ b/src/ui/widgets/D_Pad.h @@ -24,6 +24,7 @@ public: private: float m_x, m_y, m_width; std::function m_callback; + Direction m_isPressed = Direction::NONE; [[nodiscard]] Direction GetDirectionFromTap(float local_x, float local_y) const; };