我正在编写我的第一款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();
}
}
有人能指出我正确的方向来更准确地检测到这一点吗?我找不到符合我需要的答案。谢谢!
答案 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()方法中。道歉。