球从某些角度穿过桨

时间:2014-09-23 08:47:00

标签: c++ collision sfml pong

我正在用C ++和SFML 2.1为学校创建一个pong克隆,当球以锐角(它通过)击中左桨时,我遇到了一些问题。

右桨在所有角度都能正常工作,据我所知,它们使用相同的代码。

这是我用于碰撞的代码:

    for (auto& it : collisionPaddles)
    {
        if (this->ballShape.getGlobalBounds().intersects(it->getGlobalPaddleBounds()))
        {
            float deltaDistance = (this->y + this->radius) - (it->y + it->height / 2);
            bool fromLeft = true;

            if ((ballAngle < (3*myMath::MY_PI/2) && ballAngle > myMath::MY_PI/2))
            {
                fromLeft = false;
            }
            else
            {
                fromLeft = true;
            }

            ballAngle = static_cast<float>(deltaDistance * (myMath::MY_PI/180));

            if (fromLeft)
            {
                ballAngle = static_cast<float>(myMath::MY_PI - ballAngle);
            }
            moveBall(2);
        }
    }

1 个答案:

答案 0 :(得分:0)

这不是应该实施好乒乓球的方式。当你的物理模型使用一些增量时,你会得到很多人工制品。最突出的一个是穿过彼此的物体。在这种简单的情况下,deltas应仅用于动画。

这是我解决它的方式。当球获得其初始速度和运动矢量时,我会计算整个路径直到它达到玩家的基线。

  1. 从球的当前位置计算初始射线,其方向与移动方向相同。
  2. Intersect that ray with segments,它构成了你的领域的边界。
  3. 计算到达该交叉点所需的时间。
  4. 计算从交点到新运动矢量的新光线。
  5. 重复步骤2-4,直至达到玩家的基线。总结所有时间。
  6. 现在你有一个基线的相对时间和它将发生的位置。现在每一帧都应该

    1. 检查碰撞时间是否在前一帧和当前帧之间。如果是的话,
    2. 计算那一刻桨的预期位置。
    3. 如果桨的片段包含该交叉点,则会被反射。如前所述计算新路径。
    4. 通过这种方式,您将获得不受游戏开发大多数方面限制的真实游戏机制,即FPS,突然滞后等。