快速移动物体的碰撞检测

时间:2014-02-18 03:56:55

标签: java android

我正在编写我的第一款Android游戏,并遇到了碰撞检查的问题。游戏包括一个滚动场景,其中一个块在敲击时跳跃,并且必须落在不同高度的建筑物上。问题是,由于帧不能足够快地更新,因此块通常会在场内结束。我已经尝试将碰撞检测放在一个单独的线程中,虽然这确实略微改善了检测,但它仍然不是很好。虽然我通过手动设置下一帧的高度进行补偿,但我担心对于比我的Nexus 5更慢的设备,物体会直接穿过建筑物,就像它偶尔在这个设备上一样。我的代码如下:

public void physics() {

        // Generate Player Rectangle
        player.set(x1,y1, x2,y2);
        // Check building rectangle
        if (player.intersects(x1,y1,x2,y2)) {
            character.collide();
        }
    }

有人能指出我正确的方向来更准确地检测到这一点吗?我找不到符合我需要的答案。谢谢!

1 个答案:

答案 0 :(得分:1)

假设物体的X或Y速度被添加到物体坐标每个步骤事件中,“接收”物体(例如地面或墙壁)必须总是具有比移动物体的速度更大的宽度或高度。

如果物体的X坐标每步增加1000,并且墙的宽度仅为32,则射弹的边界极不可能与墙相交。简单的解决方案是将“接收”对象的边界设置为包含射弹可能的位置。

例如:

public void onStep()
{
    for (Wall wall : wall_items) // Assuming wall_items is iterable
    {
        // Do not modify walls behind or above projectile
        if (wall.x > this.x == false) continue;
        if (wall.y > this.y == false) continue; // Skip and continue loop

        wall.width = this.width + this.velocity_x;
        wall.height = this.height + this.velocity_y;
    }

    this.x += this.velocity_x;
    this.y += this.velocity_y;
}

现在,当弹丸移动时,弹丸必须落在飞行弹丸的墙壁范围内。我希望这能让你更好地理解碰撞检测。

编辑:检查墙壁是否在弹丸后面或上方的条件应该继续而不是返回,因为您仍然希望保留在onStep()方法中。道歉。