This repository has been archived on 2023-05-13. You can view files and clone it, but cannot push or open issues or pull requests.
mipt_cpp/seminar13_polymorphism/arkanoid/bonus.hpp

93 lines
2.3 KiB
C++
Raw Normal View History

2023-01-04 14:37:54 +03:00
#pragma once
2023-01-04 14:56:03 +03:00
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
class Paddle;
class Ball;
2023-01-04 14:37:54 +03:00
class Arkanoid;
2023-01-04 13:46:41 +03:00
class Bonus
{
2023-01-06 00:44:44 +03:00
protected:
2023-01-04 13:46:41 +03:00
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 = 0;
virtual void activate(Arkanoid& game) = 0;
virtual ~Bonus() = default;
2023-01-04 13:46:41 +03:00
bool isColiding(const Paddle& paddle) const;
// Класс Arkanoid должен быть дружественным, так как он может менять внутреннее объекта-бонуса
friend class Arkanoid;
};
2023-01-06 00:44:44 +03:00
class TripleBallBonus : public Bonus {
public:
TripleBallBonus(sf::Vector2f position): Bonus(position) {};
void draw(sf::RenderWindow& window) const;
void activate(Arkanoid& game);
};
class EnlargePaddleBonus : public Bonus {
public:
EnlargePaddleBonus(sf::Vector2f position): Bonus(position) {};
void draw(sf::RenderWindow& window) const;
void activate(Arkanoid& game);
};
class ShrinkPaddleBonus : public Bonus {
public:
ShrinkPaddleBonus(sf::Vector2f position): Bonus(position) {};
void draw(sf::RenderWindow& window) const;
void activate(Arkanoid& game);
};
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);
};
/*
* Effects
* */
#define _EFFECT_SLOWING_ID 0
2023-01-06 00:44:44 +03:00
class Effect {
protected:
char effectId;
2023-01-06 00:44:44 +03:00
double mStartTime;
double mDuration;
public:
Effect(char id, double start_time, double duration);
virtual ~Effect() = default;
virtual void activate(Arkanoid& game) = 0;
virtual void activate(Ball& ball) = 0;
virtual void deactivate(Arkanoid& game) = 0;
2023-01-06 00:44:44 +03:00
bool isExpired(double time);
friend class SlowingBonus;
friend class TripleBallBonus;
friend class Arkanoid;
2023-01-06 00:44:44 +03:00
};
class SlowingEffect : public Effect {
private:
float mSlowingFactor = 0.1;
char id = _EFFECT_SLOWING_ID;
2023-01-06 00:44:44 +03:00
public:
SlowingEffect(double start_time, double duration);
void activate(Arkanoid& game);
void activate(Ball& ball);
2023-01-06 00:44:44 +03:00
void deactivate(Arkanoid& game);
};