【发布时间】:2012-04-08 01:02:28
【问题描述】:
我有一个小型库,我想用它来创建游戏。首先,我尝试实现像素完美碰撞检测,但并不顺利,所以我决定使用简单的边界框碰撞检测。它工作正常,但在对象数量超过 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;
}
【问题讨论】:
-
不要检查每一对,而是尝试设置一个“智能”系统,粗略地(没有误报)估计两个物体何时会发生碰撞,以防止检查两个彼此相距不远的物体。您可以使用边界圆来完全防弹。