使用边界框进行慢速碰撞检测

时间:2012-04-07 16:04:18

标签: java android

我想要用来制作游戏的小型图书馆。首先,我尝试实现像素完美碰撞检测,但是进展不顺利,所以我决定使用简单的边界框碰撞检测。它工作正常,但在物体数量超过20左右后,它开始减速。这是我的代码: (循环运行,每秒25次)

for (int i=0;i<sc.collGr.size();i++){
    CollisionGroup gr=sc.collGr.get(i);
    Collidable[] cc=gr.getCollidables();
    for (int l=0;l<cc.length;l++){
        for (int w=l+1;w<cc.length;w++){
            if (BorderBox.areColliding(cc[l].getBorderBox(), cc[w].getBorderBox()){
                addEventToHandler(sc.collGr.get(i),cc[l],cc[w]);
            }
        }
   }
}

BorderBox类的一部分:

public class BorderBox {
int top;
int down;
int left;
int right;

/**
 * Creates new BorderBox object
 * Arguments: (top, down, left, right);
 * */
public BorderBox(int topy,int downy, int leftx,int rightx){
    top=topy;
    down=downy;
    left=leftx;
    right=rightx;
}

/**
 * Checks if two provided BorderBoxes are colliding.
 * */
public static boolean areColliding(BorderBox a,BorderBox b){
    if (b.left<=a.right && b.right>=a.left && b.down>=a.top && b.top<=a.down){
        return true;
    }
    return false;
}

2 个答案:

答案 0 :(得分:1)

检查这种方式是O(n^2)操作。也就是说,当您添加新对象时,您正在进行的工作量会逐渐增加。

我之前减轻这种情况的方法,以及其他建议,是在两个不同的数组中有两种类型的可碰撞对象。一个数组有少量对象,主要是字符,另一个数组有敌人。这个想法是你不关心与对方相撞的敌人。因此,只需检查较小数组中的元素是否与较大数组中的元素发生冲突,就可以大大减少必须完成的工作量。

这当然是针对特定游戏的,如果一切都必须与其他一切发生冲突,则无法正常工作。虽然,我发现简单的游戏往往不是这样。

答案 1 :(得分:0)

划分空间以避免检查远处物体的碰撞。根据你的游戏,一个简单的网格可以做,使用像kd-Trees这样的东西。我曾经做过一个有实际房间的游戏,我刚检查了同一个房间内的物体之间的碰撞(假设房间比对象少,或者更新哪个物体在哪个房间很容易)。