portapack-mayhem/firmware/application/external/spaceinv/ui_spaceinv.hpp
RocketGod 1d8f53b49e
Space invaders UI improvements for all device screens including new PortaRF (#2810)
* Dynamic screen for PortaRF

Dynamic screen size for new PortaRF device.

* Format code

* Space Invaders improvements for all devices including new PortaRF

Space Invaders improvements for all devices including new PortaRF
2025-10-09 22:30:30 +02:00

79 lines
No EOL
1.9 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, 275, 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__ */