安卓游戏开发:碰撞检测失败

5
我目前正在开发一款Android游戏,希望在遇到问题时能得到您的专业建议。
背景: 1. 我的游戏采用帧率无关的运动方式,在执行必要的速度计算之前考虑增量时间值。 2. 这是一个传统的2D平台游戏。
问题: 这是我的问题(简化版)。假设我的角色是一个立方体,站在一个平台上(假设“重力”是角色向下的恒定速度characterVelocityDown)。
我定义了以下碰撞检测(假设Y轴向下): 给定 characterFootY 是我的正方形角色底部的y坐标, platformSurfaceY 是平台的上部y坐标, platformBaseY 是平台的下部y坐标:
  if (characterFootY + characterVelocityDown > platformSurfaceY && characterFootY + characterDy < platformBaseY) {

                    //Collision Is True
                    characterFootY = platformSurfaceY;
                    characterVelocityDown = 0;

                } else{ 
                    characterVelocityDown = deltaTime * 6;

这种方法在游戏以正常速度运行时非常有效;但是,如果游戏变慢,deltaTime(即前一帧和当前帧之间的经过时间)会变大,而characterFootY + characterVelocityDown会超出定义碰撞检测的边界,角色就会直接掉落(就像传送一样)。如何解决这个问题以防止出现这种情况?感谢您的帮助,期待从您那里学到更多!

如果其他人也遇到了这个问题,一个可能的解决方案是限制deltaTime值,当它超过某个值时,你只需将其设置为等于上限。这将使游戏速度不一致,但在大多数情况下应该没问题。 - SeveN
你是否有前后两个增量值?因为可以通过比较它们来完成对比。 - cjk
2个回答

1
你需要做的是以恒定的时间间隔运行物理循环,并根据当前的tick迭代它所需的次数。
const float PHYSICS_TICK = 1/60.f; // 60 FPS
void Update( float dt )
{
    m_dt += dt;
    while( m_dt > PHYSICS_TICK )
    {
        UpdatePhysics( PHYSICS_TICK );
        m_dt -= PHYSICS_TICK;
    }
}

有各种技术用于处理剩余的tick(m_dt)
最小tick和最大tick的大小写也是必须的。


对于大多数游戏来说,最好/最简单的方法是为整个游戏逻辑(而不仅仅是物理)固定时间步长。 - Jeff Gates

1
我想问题在于减速是不可避免的。你可以尝试优化代码,但总会有使用较慢设备或游戏繁忙区域需要更长时间处理的用户。与其假定一个一致的增量,不如假定相反。编写代码时要意识到有人可能会尝试在算盘上安装它。
所以基本上,就像SeveN所说的那样,让你的游戏循环处理减速。在我的有限经验中,唯一真正的方法是限制delta的大小。这将导致您的时钟不会完全按时运行,但是当您考虑到大多数游戏如何处理减速时,这是最好的方法。您不会在Pentium 66上启动StarCraft并以5 FPS但全速运行,它会减速并以幻灯片方式处理,但仍然按照正常速度进行所有计算。
如果您这样做,在游戏减速期间,它会明显变慢...但所有计算应该仍然准确无误。
编辑:刚才才意识到您是SeveN。干得好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接