Witam,
Bawię się SFML i piszę, a raczej próbuję napisać prostego Arkanoida. Na chwilę obecną działa ruch piłki i odbijanie się od krawędzi ekranu oraz sterowanie paletką. Piszę OOP i mam dylemat jak zaimplementować system kolizji dla piłka-paletka oraz piłka-blok/klocek? Posiadam klasę Game (główna klasa), Paddle oraz Ball.
Gdzie powinienem umieścić kod odpowiedzialny za sprawdzanie kolizji? W klasie Game i w niej sprawdzać obiekt Paddle i Ball? A może powinienem utworzyć nową klasę, przesłać do niej obiekty Paddle i Ball? Być może głupie pytanie, ale nie mogę tego ogarnąć...
Pytanie nr 2. Do blokowania piłki i paletki w obszarze ekranu potrzebuję zmiennej WIDTH, która znajduje się w Game.hpp W chwili obecnej uczyniłem ją statyczną przez co mogę się odwołać do niej w klasach paletki i piłki, ale muszę dołączać plik nagłówkowy Game.hpp do po tych klas. Czy można ten problem rozwiązać inaczej?
Zamieszczam kod, dla zobrazowania jak to wygląda w tej chwili.
#include "Ball.hpp"
#include "Game.hpp"
Ball::Ball(float posX, float posY, float radius)
:position(posX, posY)
{
ballVelocity = 8.f;
velocity = { -ballVelocity, -ballVelocity };
shape.setRadius(radius);
shape.setPosition(posX, posY);
shape.setFillColor(Color::Red);
shape.setOrigin(radius, radius);
}
Ball::~Ball()
{
}
void Ball::update()
{
shape.move(velocity);
// Left side of ball
if (shape.getPosition().x - shape.getOrigin().x < 0)
velocity.x = ballVelocity;
// Right side of ball
if (shape.getPosition().x + shape.getOrigin().x > WIDTH)
velocity.x = -ballVelocity;
// Top side of ball
if (shape.getPosition().y - shape.getOrigin().y < 0)
velocity.y = ballVelocity;
// Bottom side of ball
if (shape.getPosition().y + shape.getOrigin().y > HEIGHT)
velocity.y = -ballVelocity;
}
void Ball::draw(RenderWindow & window)
{
window.draw(shape);
}
#include "Paddle.hpp"
#include "Game.hpp"
Paddle::Paddle(float posX, float posY, Vector2f size)
{
paddleVelocity = 6.f;
shape.setSize(size);
shape.setPosition(posX, posY);
shape.setFillColor(Color::Red);
shape.setOrigin(size.x / 2, size.y / 2);
}
void Paddle::update()
{
shape.move(velocity);
if (Keyboard::isKeyPressed(Keyboard::Left) && shape.getPosition().x - shape.getOrigin().x > 0)
velocity.x = -paddleVelocity;
else if (Keyboard::isKeyPressed(Keyboard::Right) && shape.getPosition().x + shape.getOrigin().x < WIDTH)
velocity.x = paddleVelocity;
else
velocity.x = 0;
}
void Paddle::draw(RenderWindow & windows)
{
windows.draw(shape);
}