Я делаю игру Breakout на C ++ с использованием библиотеки SFML, у меня есть класс «paddle» и класс «ball», которые обновляются и отображаются в классе «game», который использует окно рендеринга из « окно «класс.
Моя проблема в том, что для того, чтобы определить, столкнулся ли объект Ball с объектом Paddle, мне, очевидно, нужен доступ к элементам данных положения x / y объекта Paddle. Я использую функцию обновления (или отметки) для каждого объекта, я бы предпочел не просто передавать ссылку на объект Paddle в функцию обновления Ball.
Каков общепринятый способ достижения желаемой функциональности?
Вот мой заголовок Ball:
class Ball
{
public:
Ball(float x, float y, int size, sf::Vector2f moveSpeed);
~Ball();
void Tick();
void Move();
void Render(sf::RenderWindow& window);
void Reset();
sf::Vector2f GetMoveSpeed() { return m_moveSpeed; }
private:
void CheckCollision();
int m_size;
sf::Vector2f m_moveSpeed;
sf::Vector2f m_position;
sf::CircleShape m_ballCircle;
};
Вот моя функция обновления игры:
void Game::Update()
{
m_window.Update();
m_ball.Tick();
m_paddle.Tick();
}
Используйте отдельный объект, который реализует алгоритм обновления шара. Этот объект знает обо всех ваших данных: мяч и весло, и рассчитывает новую позицию.
Вы можете внедрить алгоритм в свой игровой класс, который будет содержать указатель на интерфейс. Это позволяет изменять алгоритм без изменения классов Game, Ball или Paddle.
Пусть ваш Game
проверьте столкновение и обработайте их соответствующим образом:
void Game::Update()
{
m_window.Update();
m_ball.Tick();
m_paddle.Tick();
if(areColliding(m_ball, m_paddle))
{
resolveCollision(m_ball, m_paddle);
}
}
В этом случае, areColliding
а также resolveCollision
может быть private
функции-члены Game
,