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超出定义碰撞检测的边界,并且角色会直接跌落(就像传送)。

我应该如何处理这个问题以防止这种情况发生?

提前感谢您的帮助,我期待向您学习!

4

2 回答 2

1

我想这里的问题是放缓是不可避免的。您可以尝试优化代码,但总会有用户使用慢速设备或游戏中繁忙的部分,这些部分需要比平时更长的时间来处理所有内容。与其假设一致的增量,不如假设相反。在意识到有人可以尝试将其安装在算盘上的情况下编写代码。

所以基本上,正如 SeveN 所说,让你的游戏循环处理减速。唯一真正做到这一点的方法(在我公认的有限经验中)是对 delta 的大小设置一个上限。这将导致您的时钟无法准确准时运行,但仔细想想,这就是大多数游戏处理减速的方式。您不会在奔腾 66 上启动 StarCraft 并让它以 5 FPS 但全速运行,它会减慢并正常处理它,尽管是在幻灯片放映中。

如果你做了这样的事情,在你的游戏减速期间,它会明显减速……但计算仍然应该是正确的。

编辑:刚刚意识到你是SeveN。做得好。

于 2012-06-18T08:33:18.577 回答
1

您需要做的是以恒定的增量时间运行您的物理循环,并在当前滴答声中根据需要对其进行多次迭代。

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;
    }
}

有多种技术用于处理左刻度 ( m_dt )
最小刻度和最大刻度的上限也是必须的。

于 2012-06-18T10:23:56.977 回答