【问题标题】:Android Game Development: Collision Detection FailingAndroid 游戏开发:碰撞检测失败
【发布时间】:2013-10-27 03:45:38
【问题描述】:

我目前正在开发一款适用于 Android 的游戏,希望您能就我一直遇到的问题提供专业知识。

背景:

  1. 我的游戏包含独立于帧速率的运动,它包含 在执行必要的 Velocity 之前计算增量时间值 计算。

  2. 该游戏是一款传统的 2D 平台游戏。

问题:

这是我的问题(简化)。假设我的角色是一个站在平台顶部的正方形(“重力”是 characterVelocityDown 的恒定向下速度)。

我已将碰撞检测定义如下(假设 Y 轴指向下方):

鉴于 characterFootY 是我的方形字符底部的 y 坐标,platformSurfaceY 是我平台的上 y 坐标,platformBaseY strong> 是我平台的下 y 坐标:

  if (characterFootY + characterVelocityDown > platformSurfaceY && characterFootY + characterDy < platformBaseY) {

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

                } else{ 
                    characterVelocityDown = deltaTime * 6;

当游戏以正常速度运行时,这种方法非常有效;但是,如果游戏速度变慢,deltaTime(即前一帧和当前帧之间经过的时间)变大,characterFootY + characterVelocityDown 超出了定义碰撞检测的边界,角色就会直接穿过(就像传送一样)。

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

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

【问题讨论】:

  • 如果其他人遇到此问题,可能的解决方案是设置 deltaTime 值的上限,以便当它超过某个值时,您只需将其设置为等于上限。这会使游戏速度不一致,但在大多数情况下应该没问题。
  • 您是否同时拥有前后 delta 值,因为可以在那里进行比较?

标签: android collision-detection


【解决方案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)
最小刻度和最大刻度的上限也是必须的。

【讨论】:

  • 对于大多数游戏来说,最好/最简单的方法是为整个游戏逻辑(不仅仅是物理)固定时间步长。
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多