#pragma once #include #include #include #include "Animation.h" class FireworkRocket { private: enum LaunchPhase { PHASE_RISING, PHASE_SPREADING, PHASE_DONE }; std::array m_flareXPos; std::array m_flareYPos; LaunchPhase m_phase; int m_rocketXPos; int m_rocketYPos; int m_targetHeight; int m_riseSpeed; uint64_t m_spreadStartFrame; Fader::Color m_color; public: FireworkRocket(int start_x, int target_height, int rise_speed, const Fader::Color &color); void move(uint64_t frame); void render(Fader *fader); bool done(void) const { return m_phase == PHASE_DONE; } }; class FireworkAnimation : public Animation { public: FireworkAnimation(Fader *fader, int vspeed = 128, int spawn_rate = 8); void loop(uint64_t frame) override; void stop(void) override { m_stopping = true; } void reset(void) override; private: std::default_random_engine m_gen; std::list m_rockets; int m_vspeed; int m_spawnRate; // average pixels per second bool m_stopping; };