我想要用来制作游戏的小型图书馆。首先,我尝试实现像素完美碰撞检测,但是进展不顺利,所以我决定使用简单的边界框碰撞检测。它工作正常,但在物体数量超过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;
}
答案 0 :(得分:1)
检查这种方式是O(n^2)
操作。也就是说,当您添加新对象时,您正在进行的工作量会逐渐增加。
我之前减轻这种情况的方法,以及其他建议,是在两个不同的数组中有两种类型的可碰撞对象。一个数组有少量对象,主要是字符,另一个数组有敌人。这个想法是你不关心与对方相撞的敌人。因此,只需检查较小数组中的元素是否与较大数组中的元素发生冲突,就可以大大减少必须完成的工作量。
这当然是针对特定游戏的,如果一切都必须与其他一切发生冲突,则无法正常工作。虽然,我发现简单的游戏往往不是这样。
答案 1 :(得分:0)
划分空间以避免检查远处物体的碰撞。根据你的游戏,一个简单的网格可以做,使用像kd-Trees这样的东西。我曾经做过一个有实际房间的游戏,我刚检查了同一个房间内的物体之间的碰撞(假设房间比对象少,或者更新哪个物体在哪个房间很容易)。