如果这太过数学,我想道歉。

我有一个项目,必须使用老师的自定义游戏引擎来创建AngryBirds游戏,但是我被弹弓背后的数学所困扰。我们不允许使用任何标准库。左上角是0、0,向下时y轴增加。窗口的总宽度为1280像素,高度为720像素。当您将鸟拉离悬带起点257、524时,我正试图使它走得更远。我从一开始就使用释放时的y值,以使鸟不会进入y-中的其他位置。放开后将轴笔直。目前,这只鸟在y轴上增加了,鉴于我的代码正是这样做的,这是可以预期的。我创建了一个变量,用于确定一旦放开鼠标,鸟距弹弓的起点有多远,我想在速度计算中使用该值。我不知道在二次公式中使用什么值才能使小鸟停留在屏幕上。我试图说明窗口以使其更清晰。

float y = getY() + getX()/10 * getX()/10 * (game_time.delta.count() / 10000.f);
setY(y);

//window illustration
------------------------------------------------------------------------------
| (0, 0)                                                                     |
|                                                                            |
|                                                                            |
|                        o         o                                         |
|                 o                                                          |
|             o                              o                               |
|                                                                            |
|bird-> o\ / (257, 524)                             o                        |
|         |                                                                  |
|_________|______________________________________________________(1280, 720)_|

最佳答案

您有两个问题:

  • 缺乏基础物理学知识,与斜射有关。
  • 窗口的原点在左上角表示左侧的坐标系。

  • 对于第一部分,建议您阅读一些有关斜射物理的文章,例如kinematics of projectile motion

    简单来说:
  • 将鸟的运动分为水平和垂直部分:
  • 水平部分是匀速运动
  • 垂直运动是受恒定力
  • 影响的运动
  • 根据时间独立计算速度和位置的水平和垂直分量
  • 使用计算出的位置绘制“鸟”

  • 通过将坐标系放在y朝上的窗口的左下部,可以轻松解决第二个问题。这样,您将拥有一个“右手”坐标系,该坐标系将使用上述链接上找到的方程式,用于所有计算。

    当您需要实际“绘制”鸟时,请对y坐标使用以下变换:
    y_draw = window_height - y_calculated;
    

    不要忘记为x和y添加适当的偏移量,以补偿微积分的原点与弹弓的位置不同的事实。

    关于c++ - 无法找出弹弓所需二次曲线背后的数学运算,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61331693/

    10-11 05:57