#pragma once #include #include class Paddle; class Ball; class Arkanoid; class Bonus { protected: inline static const float speed = 120; inline static const float radius = 15; sf::Vector2f m_position; float m_time; public: Bonus(sf::Vector2f position); void update(float dt); virtual void draw(sf::RenderWindow& window) const {}; virtual void activate(Arkanoid& game){}; virtual ~Bonus(){}; bool isColiding(const Paddle& paddle) const; // Класс Arkanoid должен быть дружественным, так как он может менять внутреннее объекта-бонуса friend class Arkanoid; }; class TripleBallBonus : public Bonus { public: TripleBallBonus(sf::Vector2f position): Bonus(position) {}; void draw(sf::RenderWindow& window) const; void activate(Arkanoid& game); ~TripleBallBonus(); }; class EnlargePaddleBonus : public Bonus { public: EnlargePaddleBonus(sf::Vector2f position): Bonus(position) {}; void draw(sf::RenderWindow& window) const; void activate(Arkanoid& game); ~EnlargePaddleBonus(); }; class ShrinkPaddleBonus : public Bonus { public: ShrinkPaddleBonus(sf::Vector2f position): Bonus(position) {}; void draw(sf::RenderWindow& window) const; void activate(Arkanoid& game); ~ShrinkPaddleBonus(); }; class SlowingBonus : public Bonus { private: double mDuration = 10; public: SlowingBonus(sf::Vector2f position): Bonus(position) {}; void draw(sf::RenderWindow& window) const; void activate(Arkanoid& game); ~SlowingBonus(); }; /* * Effects * */ class Effect { private: char effectId; double mStartTime; double mDuration; public: Effect(char id, double start_time, double duration); virtual void activate(Arkanoid& game) {}; virtual void activate(Ball& ball) {}; virtual void deactivate(Arkanoid& game) {}; bool isExpired(double time); friend class SlowingBonus; friend class TripleBallBonus; friend class Arkanoid; }; class SlowingEffect : public Effect { private: double mSlowingFactor = 0.1; char id = 0; public: SlowingEffect(double start_time, double duration); void activate(Arkanoid& game); void activate(Ball& ball); void deactivate(Arkanoid& game); };