【问题标题】:How should I pass an object to a class to check for collisions?我应该如何将对象传递给类以检查冲突?
【发布时间】:2018-03-09 11:39:20
【问题描述】:

我正在使用 SFML 库在 C++ 中制作一个 Breakout 游戏,我有一个“桨”类和一个“球”类,它们都在使用渲染窗口的“游戏”类中更新和渲染来自“窗口”类。

我的问题是,为了确定 Ball 对象是否与 Paddle 对象发生碰撞,我显然需要访问 Paddle 对象的 x/y 位置数据成员。我正在为每个对象使用更新(或刻度)函数,我宁愿不只是将 Paddle 对象的引用传递给 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();
}

【问题讨论】:

  • 听起来你的游戏应该检查是否有任何物体发生碰撞,然后适当地处理它们。您的桨或球都不会相互了解。

标签: c++ class oop breakout data-members


【解决方案1】:

使用实现更新球的算法的单独对象。该对象了解您的所有数据:球和桨,并计算新位置。

您可以将算法注入到您的游戏类中,该类将保存指向接口的指针。这允许您在不更改 Game、Ball 或 Paddle 类的情况下更改算法。

【讨论】:

    【解决方案2】:

    让您的Game 检查碰撞并妥善处理:

    void Game::Update()
    {
        m_window.Update();
        m_ball.Tick();
        m_paddle.Tick();
    
        if(areColliding(m_ball, m_paddle))
        {
            resolveCollision(m_ball, m_paddle);
        }
    }
    

    在这种情况下,areCollidingresolveCollision 可以是Gameprivate 成员函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-22
      • 2021-01-02
      • 1970-01-01
      相关资源
      最近更新 更多