实现2D重力和基本碰撞C ++和基于OpenGL Tile的侧滚动游戏

时间:2015-02-09 05:17:17

标签: c++ opengl 2d collision gravity

我有一些问题需要正确实现一个系统,它可以增加重力给我的播放器,同时仍能检测并纠正与地板的碰撞。我理解AABB的基本数学,并将重力矢量添加到球员速度矢量,然后将其添加到位置。由于某种原因,当我尝试播放器停止前几帧时,最终速度增加到超过平铺宽度并且它通过。我想我真正的问题是如何正确地实现碰撞引力。当它撞到地板时我是否会使重力矢量为0,或者当我只是站在地板上时我的碰撞检测会不断地将我从地板上移开?我真的不知道这种情况下的逻辑流程。

编辑1: 我正在尝试自己制作简单的引擎以获得编程经验。我解决了一个问题,我现在可以停在场上了。我目前的逻辑是: 将重力加到速度,检查碰撞,通过碰撞的偏移调整速度,如果有的话,将速度加到位置然后将速度设置为0。

m_velocity += m_gravity;

glm::vec2 mtd = collideWithObject(objectVector);

m_velocity -= mtd;

m_position += m_velocity;

m_velocity.x = 0.0f;
m_velocity.y = 0.0f;

它有效,但我不确定这是不是流程,我想我只是想知道实现它的最常用方法是什么。

2 个答案:

答案 0 :(得分:0)

  

由于某些原因,当我尝试播放器停止前几帧时,最终速度会增加到超过平铺宽度并且它会通过。

如果您以增量方式应用物理 - 例如每帧一次 - 您必须说明每个点之间存在的无限增量。

对于简单的"飞机碰撞",就像你的地板一样,不要测试你当前的AABB是否与地板发生碰撞。创建包含当前 AABB和最后 AABB的最小AABB。如果 框发生碰撞,则表示您已与飞机相撞。

答案 1 :(得分:0)

正如@MorphingDragon所提到的,你应该考虑Box2D,很多游戏都使用Box2D。

对于你的问题"当它撞到地板时我是否会使重力矢量为0,或者当我只是站在地板上时,我的碰撞检测会不断地将我从地板上移开?在这种情况下,我真的不知道逻辑的流动。"。我只是假设你知道Verlet integration,为了计算你的新位置,你不需要改变你的引力,[你知道,重力在地球上无处不在,或者你想在太空中进行游戏, ;)你只需要处理碰撞检测逻辑为"当发生碰撞时,只需使碰撞点满足我的约束条件,并且你的约束应该是#34;所有点都不应放在地板,否则只需移动它并使其坐在地板上即可。

集合检测和约束求解器理论在现代物理引擎中应该非常普遍,易于理解和实现。

希望得到这个帮助。

由于 一个