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.cpp

92 lines
3.3 KiB
C++
Raw Normal View History

2023-01-04 14:37:54 +03:00
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
#include <cmath>
#include "bonus.hpp"
#include "arkanoid.hpp"
const double pi = 3.14159265358979323846;
Bonus::Bonus(sf::Vector2f position): m_position(position)
{
m_time = 0;
}
// Двигаем бонус
void Bonus::update(float dt)
{
m_time += dt;
m_position.y += speed * dt;
}
// Рисуем бонус
void Bonus::draw(sf::RenderWindow& window) const
{
// Рисуем белый круг
static sf::CircleShape shape(radius);
shape.setOrigin(radius, radius);
shape.setFillColor(sf::Color{100, 200, 100});
shape.setPosition(m_position);
window.draw(shape);
float angle = 0;
// Рисуем 3 шарика на этом круге
static Ball ball {5, {0, 0}, {0, 0}};
float ballRotationRadius = 7;
ball.position = m_position + ballRotationRadius * sf::Vector2f(std::cos(angle), std::sin(angle));
ball.draw(window);
angle += 2.0 * pi / 3.0;
ball.position = m_position + ballRotationRadius * sf::Vector2f(std::cos(angle), std::sin(angle));
ball.draw(window);
angle += 2.0 * pi / 3.0;
ball.position = m_position + ballRotationRadius * sf::Vector2f(std::cos(angle), std::sin(angle));
ball.draw(window);
}
/*
Функция Bonus::activate
Применяем эффект бонуса (в данном случае - утроение шариков)
numBalls - Количество шариков до утроения
Шарики хранятся в связном списке m_balls
Так как мы работаем со связным списком, то придётся использовать итератор it
Проходим итератором по изначальным элементам списка и добавляем новые шарики в список
В данном случае простой цикл через итераторы не сработает, так как массив game.m_balls увеличивается в процессе выполнения цикла.
Внутри цикла выбираем случайный вектор скорости и добавляем шарик в список game.m_balls
Делаем то же самое для ещё одного шарика
В конце цикла переходим ко следующему шарику в списке, т.е. увеличивем итератор it
*/
void Bonus::activate(Arkanoid& game)
{
int numBalls = game.m_balls.size();
std::list<Ball>::iterator it = game.m_balls.begin();
for (int i = 0; i < numBalls; i++)
{
float angle = rand() % 1000 * (2 * pi / 1000);
float vx = Ball::initialVelocity * sin(angle);
float vy = Ball::initialVelocity * cos(angle);
game.addBall({game.m_initialBall.radius, (*it).position, {vx, vy}});
angle = rand() % 1000 * (2 * pi / 1000);
vx = Ball::initialVelocity * sin(angle);
vy = Ball::initialVelocity * cos(angle);
game.addBall({game.m_initialBall.radius, (*it).position, {vx, vy}});
it++;
}
}
bool Bonus::isColiding(const Paddle& paddle) const
{
bool result = paddle.getBorder().intersects({m_position.x - radius, m_position.y - radius, 2 * radius, 2 * radius});
return result;
}