Ver código fonte

:sparkles: button can now be clicked

Felix Bytow 1 ano atrás
pai
commit
3043fe060c
5 arquivos alterados com 52 adições e 4 exclusões
  1. 6 3
      game/DummyState.cxx
  2. 1 1
      game/DummyState.hxx
  3. 4 0
      game/GameStateManager.hxx
  4. 33 0
      game/ui/Button.cxx
  5. 8 0
      game/ui/Button.hxx

+ 6 - 3
game/DummyState.cxx

@@ -1,12 +1,15 @@
 #include "DummyState.hxx"
+#include "GameStateManager.hxx"
 
 #include "../SDLRenderer.hxx"
 
 void DummyState::update(GameStateManager& gsm, std::chrono::milliseconds delta_time)
 {
-  (void) gsm;
   time_in_state_ += delta_time;
-  test_button_.set_pressed((time_in_state_.count() % 4'000) >= 2'000);
+  quit_button_.set_on_click([&gsm] mutable{
+    gsm.pop_state();
+  });
+  quit_button_.update();
 }
 
 void DummyState::render(SDLRenderer& renderer)
@@ -14,7 +17,7 @@ void DummyState::render(SDLRenderer& renderer)
   SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE);
   SDL_RenderClear(renderer);
 
-  test_button_.render(renderer);
+  quit_button_.render(renderer);
 
   SDL_RenderPresent(renderer);
 }

+ 1 - 1
game/DummyState.hxx

@@ -14,7 +14,7 @@ public:
 
 private:
   std::chrono::milliseconds time_in_state_{0};
-  Button test_button_{"Test", 15, 15, 300, 80};
+  Button quit_button_{"Test", 15, 15, 300, 80};
 };
 
 #endif // SNAKE_DUMMYSTATE_HXX

+ 4 - 0
game/GameStateManager.hxx

@@ -23,6 +23,10 @@ public:
 
   ~GameStateManager();
 
+  GameStateManager(GameStateManager const&) = delete;
+
+  GameStateManager& operator=(GameStateManager) = delete;
+
   GameState* current();
 
   void push_state(GameStates new_state);

+ 33 - 0
game/ui/Button.cxx

@@ -124,6 +124,8 @@ Button::Button(std::string title, int x, int y, int w, int h)
   assert(w_>=12);
   assert(h_>=14);
 
+  on_click_ = [] { };
+
   up_ = std::async(std::launch::deferred, [] {
     return AssetManager::instance().get_texture_asset("blue_button_up.png");
   });
@@ -310,3 +312,34 @@ void Button::render(SDLRenderer& renderer)
 
   SDL_DestroyTexture(text_ure);
 }
+
+void Button::update()
+{
+  int mouse_x, mouse_y;
+  auto const mouse_button = SDL_GetMouseState(&mouse_x, &mouse_y);
+
+  if ((mouse_x>=x_ && mouse_x<=(x_+w_) && mouse_y>=y_ && mouse_y<=(y_+h_))) {
+    if (mouse_button & SDL_BUTTON(SDL_BUTTON_LEFT)) {
+      pressed_ = true;
+    }
+    else {
+      if (pressed_) {
+        trigger();
+      }
+      pressed_ = false;
+    }
+  }
+  else {
+    pressed_ = false;
+  }
+}
+
+void Button::trigger()
+{
+  on_click_();
+}
+
+void Button::set_on_click(std::function<void()> handler)
+{
+  on_click_ = std::move(handler);
+}

+ 8 - 0
game/ui/Button.hxx

@@ -6,6 +6,7 @@
 #include <SDL.h>
 #include <SDL_ttf.h>
 
+#include <functional>
 #include <future>
 #include <string>
 
@@ -19,12 +20,19 @@ public:
 
   bool is_pressed() const;
 
+  void update();
+
   void render(SDLRenderer& renderer);
 
+  void trigger();
+
+  void set_on_click(std::function<void()> handler);
+
 private:
   std::string title_;
   int x_, y_, w_, h_;
   bool pressed_;
+  std::function<void()> on_click_;
 
   std::shared_future<SDL_Texture*> up_;
   std::shared_future<SDL_Texture*> down_;