如果这太过数学,我想道歉。
我有一个项目,必须使用老师的自定义游戏引擎来创建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/