77 lines
2.7 KiB
C++
77 lines
2.7 KiB
C++
#pragma once
|
||
#include <list>
|
||
#include "ball.hpp"
|
||
//class Ball;
|
||
#include "brick_grid.hpp"
|
||
#include "bonus.hpp"
|
||
|
||
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;
|
||
};
|