#pragma once #ifndef SNAKE_MENUSTATE_HXX #define SNAKE_MENUSTATE_HXX #include "GameState.hxx" #include "ui/Button.hxx" #include class PlayingState; class MenuState final : public GameState { public: void on_enter(GameStateManager& gsm) override; void on_leave() override; void on_event(GameStateManager& gsm, SDL_Event const& evt) override; void update(GameStateManager& gsm, std::chrono::milliseconds delta_time) override; void render(SDLRenderer& renderer) override; private: static int constexpr ACTIVE_SIZE_DIFF = 32; static int constexpr BUTTON_HEIGHT = 80; static int constexpr BUTTON_WIDTH = 350; void handle_key_up(GameStateManager& gsm, SDL_Scancode scancode); void handle_key_down(SDL_Scancode scancode); void handle_controller_button_up(GameStateManager& gsm, std::uint8_t button); void handle_controller_button_down(std::uint8_t button); void handle_mouse_movement(int x, int y); void handle_controller_axis_motion(std::uint8_t axis, std::int16_t value); void select_previous_button(); void select_next_button(); void trigger_active_button(); Button new_game_button_{0, 0, BUTTON_WIDTH, BUTTON_HEIGHT, UiColor::Green}; Button continue_button_{0, 0, BUTTON_WIDTH, BUTTON_HEIGHT, UiColor::Blue}; Button high_score_button_{0, 0, BUTTON_WIDTH, BUTTON_HEIGHT}; Button credits_button_{0, 0, BUTTON_WIDTH, BUTTON_HEIGHT}; Button quit_button_{0, 0, BUTTON_WIDTH, BUTTON_HEIGHT, UiColor::Red}; std::optional game_{}; int active_button_{0}; int last_controller_direction_{0}; }; #endif // SNAKE_MENUSTATE_HXX