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/arkanoid.hpp
2023-01-04 14:56:03 +03:00

78 lines
2.7 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include <list>
#include "ball.hpp"
#include "brick_grid.hpp"
#include "paddle.hpp"
class Bonus;
class Arkanoid
{
private:
// Константы:
// Цвет задника
const sf::Color kBackgroundColor {12, 31, 47};
// Максимально возможное количество шариков в один момент времени
const unsigned kMaxNumBalls {250};
// Максимально возможное количество бонусов в один момент времени
const unsigned kMaxNumBonuses {10};
// Поля:
// Время, которое прошло с начала игры в секундах
double m_time;
// Границы игрового поля
sf::FloatRect m_border;
// Связный список всех шариков
std::list<Ball> m_balls;
// Объект, задающий состояние сетки блоков
BrickGrid m_brickGrid;
// Ракетка
Paddle m_paddle;
// Состояние игры
enum class GameState {stuck, running, endLose, endWin};
GameState m_gameState;
// Текущее число жизней
int m_numLives;
// Связный список указателей на бонусы
// Почему указатели - для реализации полиформизма
// Так как в будущем мы хотим сделать несколько вариантов бонусов
std::list<Bonus*> m_bonuses;
// Вероятность того, что при разрушении блока выпадет бонус
float m_bonusProbability;
// Макет шарика, используемый для рисова
Ball m_initialBall {6, {0, 0}, {0, 0}};
// Текст, который рисуется в конце игры
sf::Text m_endText;
void addRandomBonus(sf::Vector2f position);
// Функция, которая обрабатывает все столкновения шарика
void handleBallCollisions(Ball& ball);
public:
Arkanoid(sf::FloatRect border, sf::Font& font);
sf::FloatRect getBorder() const;
const Paddle& getPaddle() const;
const BrickGrid& getBrickGrid() const;
void addBall(const Ball& ball);
// Эта функция вызывается каждый кадр
void update(const sf::RenderWindow& window, float dt);
void draw(sf::RenderWindow& window);
void onMousePressed(sf::Event& event);
// Класс бонус должен быть дружественным, так как он может менять внутреннее состояние игры
friend class Bonus;
};