#include #include class Particle { public: Particle(const Rect& rect, float vx, float vy, float ax, float ay, float duration, const Color& color = Color(255, 255, 255), TexturePtr texture = nullptr); ~Particle(); void render(); void update(); bool hasFinished() { return m_finished; } private: Rect m_rect; Color m_color; TexturePtr m_texture; int m_ix, m_iy; PointF m_s0, m_v, m_a; float m_vx, m_vy; float m_ax, m_ay; float m_duration; ticks_t m_startTicks; bool m_finished; }; typedef std::shared_ptr ParticlePtr; class ParticleEmitter { public: ParticleEmitter(const Point& position, float duration, int particlesPerSecond); void render(); void update(); bool hasFinished() { return m_finished; } private: // self related Point m_position; int m_duration; ticks_t m_startTicks; bool m_finished; int m_particlesPerSecond, m_createdParticles; std::list m_particles; // particles size Size m_pMinSize, m_pMaxSize; // particles initial position related to emitter position float m_pPositionMinRadius, m_pPositionMaxRadius; float m_pPositionMinAngle, m_pPositionMaxAngle; // particles initial velocity float minVelocity, maxVelocity; float minVelocityAngle, maxVelocityAngle; // particles initial acceleration float minAcceleration, maxAcceleration; float minAccelerationAngle, maxAccelerationAngle; // particles duration float m_pMinDuration, m_pMaxDuration; // color ralated Color color; // texture related }; typedef std::shared_ptr ParticleEmitterPtr; class Affector { public: virtual void update() {} }; class Gravity270Affector : public Affector { public: void update() { } }; class ParticlesSystem { public: void add(const ParticleEmitterPtr& emitter); void render(); void update(); private: std::list m_emitters; std::list m_affectors; };