1

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

我有一个项目,我必须使用我们老师的自定义游戏引擎创建一个 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)_|
4

1 回答 1

1

你有两个问题:

  • 缺乏基本物理知识,与斜射有关。
  • 窗口原点位于左上角意味着离开坐标系。

对于第一部分,我建议您阅读一些关于斜射物理的文章,例如抛射运动的运动学

简单来说:

  • 将鸟的运动分为水平和垂直部分:

    • 水平部分是匀速运动
    • 垂直运动是受恒力影响的运动
  • 根据时间独立计算速度和位置的水平和垂直分量

  • 使用计算的位置来绘制“鸟”

第二个问题很容易解决,方法是将坐标系放在窗口的左下角,y 指向上方。这样,您就有了一个“右手”坐标系,该坐标系将用于使用上述链接上的方程式进行的所有计算。

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

y_draw = window_height - y_calculated;

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

于 2020-04-20T21:39:02.160 回答