Как я должен передать объект в класс, чтобы проверить наличие коллизий?

Я делаю игру 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();
}

2

Решение

Используйте отдельный объект, который реализует алгоритм обновления шара. Этот объект знает обо всех ваших данных: мяч и весло, и рассчитывает новую позицию.

Вы можете внедрить алгоритм в свой игровой класс, который будет содержать указатель на интерфейс. Это позволяет изменять алгоритм без изменения классов Game, Ball или Paddle.

1

Другие решения

Пусть ваш 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,

0

По вопросам рекламы [email protected]