当前位置: 首页 > 知识库问答 >
问题:

球从一定角度穿过球拍

傅树
2023-03-14

我正在用C和SFML 2.1为学校创建一个乒乓球克隆,当球以锐角撞击左侧球拍(球穿过)时,我有一个小问题。

右桨在所有角度都很好,据我所知,他们使用的是相同的代码

这是我用于碰撞的代码:

    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个答案

茅星华
2023-03-14

这不是一个好的乒乓球应该被实现的方式。当你的物理模型使用一些Delta时,你会得到很多人工制品。其中最突出的是物体相互穿过。在这种简单的情况下,增量只能用于动画。

这是我解决它的方法。当球获得其初始速度和运动矢量时,我会计算整个路径,直到它击中球员的底线。

  1. 从球的当前位置计算初始光线,方向与球移动的方向相同

现在你有了一个相对的时间与基线和它将发生的地方。现在在每一帧上,你应该

  1. 检查碰撞时间是否在前一帧和当前帧之间。如果是的话,
  2. 计算此时桨叶的预期位置
  3. 如果桨叶段包含该交点,则其被反射。如前所述计算新路径

通过这种方式,你将获得真正的游戏机制,不受游戏开发的大多数方面的限制,即FPS、突然滞后等。

 类似资料:
  • 通常只有Y轴运动在这样的游戏中可用,但我决定让它在这样一种方式,X轴桨运动也被允许。 起初,我认为这与像素有关,但我也尝试了多种方式改变桨碰撞,但没有任何积极的结果。无论我试了多少次,球都不会从桨上弹下来。 代码非常简单,我每次只移动1px: 为了移动桨叶,我使用简单的标志,在按键时将移动方向设置为“开”,在按键释放时设置为“关”。我在不定式循环中运行它,所以它不断地被执行。 这就是“run()”

  • 本文向大家介绍java桌球小游戏 小球任意角度碰撞,包括了java桌球小游戏 小球任意角度碰撞的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了java桌球小游戏的具体代码,供大家参考,具体内容如下 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 我在WAS 8.0上部署了一个JAX-RS WS应用程序,其中包含一个空的2.4web.xml,这个类扩展了'javax.WS.rs.core.application'和2个资源,它工作得很好。 如何在WAS7.0上部署JAX-RS应用程序而不使用Jersey或任何其他与应用程序服务器相关的类? 谢谢

  • 我正在为一个使用精灵工具包物理引擎的小型弹跳球游戏工作。我的问题是: 当我对弹跳球施加巨大的冲力使其快速落在地面上时,有时它可能会穿过地面(非常薄,高度=2)。 我在Apple文档中找到了这个,但它不起作用。 为小型或快速移动的对象指定高精度碰撞 当 Sprite Kit 执行碰撞检测时,它首先确定场景中所有物理体的位置。然后,它确定是否发生了冲突或接触。这种计算方法速度很快,但有时会导致错过碰撞

  • 本节暂未进行完全的重写,错误可能会很多。如果可能的话,请对照原文进行阅读。如果有报告本节的错误,将会延迟至重写之后进行处理。 此时我们已经有了一个包含有很多砖块和玩家的一个挡板的关卡。与经典的Breakout内容相比还差一个球。游戏的目的是让球撞击所有的砖块,直到所有的可销毁砖块都被销毁,但同时也要满足条件:球不能碰触屏幕的下边缘。 除了通用的游戏对象组件,球还需要有半径和一个布尔值,该布尔值用于

  • 我的游戏循环中有以下代码: 它做它应该做的事情:当你按下A时,它逆时针转动。按D键时,它会顺时针转动。当你按W时,它向前,当你按S时,它向后。然而,如果我拿着W和D,一开始它会像应该的那样绕一个圈,但它会慢慢地开始向左上角的方向移动。我该怎么解决这个问题?