A4/Bubble.cpp

63 lines
1.8 KiB
C++
Raw Normal View History

2024-11-06 16:59:37 -07:00
#include <memory>
#include <SFML/Graphics.hpp>
#include <SFML/Graphics/CircleShape.hpp>
#include "Bubble.h"
Bubble::Bubble(
const unsigned int INITIAL_X,
const unsigned int INITIAL_Y,
const double INITIAL_X_DIR,
const double INITIAL_Y_DIR,
const float RADIUS,
const sf::Color COLOR,
std::shared_ptr<sf::Music> BOING_SOUND
): _pBoingSound(std::move(BOING_SOUND)) {
_circleShape = sf::CircleShape(RADIUS);
_circleShape.setPosition(INITIAL_X, INITIAL_Y);
_circleShape.setFillColor(COLOR);
_xDir = INITIAL_X_DIR;
_yDir = INITIAL_Y_DIR;
}
void Bubble::draw(sf::RenderWindow& window) const {
window.draw(_circleShape);
}
void Bubble::updatePosition(const unsigned int WINDOW_WIDTH, const unsigned int WINDOW_HEIGHT) {
sf::Vector2f currentPosition = _circleShape.getPosition();
// While inverting sign of the direction is simpler, that method gets bubbles stuck on the wall
// Giving explicit sign forces the ball in the correct direction instead.
if (
(currentPosition.x < 0 && _xDir < 0)
|| (
(currentPosition.x + _circleShape.getRadius() * 2) > WINDOW_WIDTH
&& _xDir > 0
)
) {
// If over left wall & going left, invert
// OR if over right wall & going right, invert
_xDir = -_xDir;
_pBoingSound->play();
}
if (
(currentPosition.y < 0 && _yDir < 0)
|| (
(currentPosition.y + _circleShape.getRadius() * 2) > WINDOW_HEIGHT
&& _yDir > 0
)
) {
// If over top wall & going up, invert
// OR if over bottom wall & going down, invert
_yDir = -_yDir;
_pBoingSound->play();
}
currentPosition.x += _xDir;
currentPosition.y += _yDir;
_circleShape.setPosition(currentPosition);
}