portapack-mayhem/firmware/application/external/spaceinv/ui_spaceinv.hpp
RocketGod 7b91103118
Made the Space Invaders game. Argh matey! (#2709)
* Made the Space Invaders game. Argh matey!
* Format code, sigh.
2025-06-21 08:35:52 +02:00

79 lines
2 KiB
C++

/*
* ------------------------------------------------------------
* | Made by RocketGod |
* | Find me at https://betaskynet.com |
* | Argh matey! |
* ------------------------------------------------------------
*/
#ifndef __UI_SPACEINV_H__
#define __UI_SPACEINV_H__
#include "ui.hpp"
#include "ui_navigation.hpp"
#include "event_m0.hpp"
#include "message.hpp"
#include "irq_controls.hpp"
#include "random.hpp"
#include "lpc43xx_cpp.hpp"
#include "ui_widget.hpp"
#include "app_settings.hpp"
namespace ui::external_app::spaceinv {
using Callback = void (*)(void);
class Ticker {
public:
Ticker() = default;
void attach(Callback func, double delay_sec);
void detach();
};
void check_game_timer();
void game_timer_check();
class SpaceInvadersView : public View {
public:
SpaceInvadersView(NavigationView& nav);
~SpaceInvadersView(); // Destructor will trigger settings save
void on_show() override;
std::string title() const override { return "Space Invaders"; }
void focus() override { dummy.focus(); }
void paint(Painter& painter) override;
void frame_sync();
bool on_encoder(const EncoderEvent event) override;
bool on_key(KeyEvent key) override;
uint32_t highScore = 0;
bool easy_mode = false;
private:
NavigationView& nav_;
Button button_difficulty{
{70, 285, 100, 20},
"Mode: HARD"};
app_settings::SettingsManager settings_{
"spaceinv",
app_settings::Mode::NO_RF,
{{"highscore"sv, &highScore},
{"easy_mode"sv, &easy_mode}}};
Button dummy{
{240, 0, 0, 0},
""};
MessageHandlerRegistration message_handler_frame_sync{
Message::ID::DisplayFrameSync,
[this](const Message* const) {
this->frame_sync();
}};
};
} // namespace ui::external_app::spaceinv
#endif /* __UI_SPACEINV_H__ */