与许多物体的碰撞检测
问题内容:
我主要专注于图形方面,以创建一些2DGame。我看过/看过几本教程,但是没有一部教程那么令人满意。我已经有一个玩家(一个正方形)在屏幕上移动并与其他正方形碰撞。重力等。
如果在屏幕上看到的对象太多(30 * 20),则一切正常。但是,如果我将其增加到300 * 300,则该程序开始运行非常慢,因为它必须检查许多对象。
我真的不知道Minecraft之类的游戏如何与ALL THOSE块一起使用,我的程序已经放弃了300 * 300块。
我已经尝试过仅在对象可见时检查冲突,但这导致程序检查每个对象的可见性,从而导致相同的问题。我究竟做错了什么?帮助表示赞赏。
我将发布一些有关如何处理碰撞的代码。
player.collision(player, wall);
public void collision(Tile object1, Tile[] object2){
collisionCheckUp(object1, object2);
collisionCheckDown(object1, object2);
collisionCheckLeft(object1, object2);
collisionCheckRight(object1, object2);
}
public void collisionCheckDown(Tile object1, Tile[] object2){
for (int i = 0; i < Map.tileAmount; i++){
if(object2[i] != null && object2[i].visible)
{
if(object1.isCollidingDown(object2[i])){
object1.collisionDown = true;
return;
}
}
}
object1.collisionDown = false;
}
public void compileHullDown(){
collisionHull = new Rectangle((int)x+3, (int)y+3, width-6, height);
}
int wallCount = 0;
for (int x=0;x<Map.WIDTH;x++) {
for (int y=0;y<Map.HEIGHT;y++) {
if (Map.data[x][y] == Map.BLOCKED) {
wall[wallCount] = new Tile(x * Map.TILE_SIZE, y * Map.TILE_SIZE);
wallCount++;
}
}
}
问题答案:
优化冲突检测的常用方法是使用空间分区对对象进行分类/管理。
这种方法的总体思路是,您要构建一棵代表空间的树,然后根据对象的位置将其放入该树中。计算碰撞时,将遍历树。这样,您将需要执行的计算比使用蛮力方法少得多,因为您将忽略分支中除遍历对象之外的所有对象。Minecraft和类似的应用可能使用八叉树进行碰撞(也可能用于渲染)。
最常见的空间分区结构是BSP树,kd树(BSP
树的一种特殊类型)。比较简单的方法是在开始时使用统一的空间分区-
将空间分成与轴对齐的两半。
我发现的关于碰撞的最佳资源是本书。它应阐明您对该主题的所有问题。
那是您想做对的事。如果要快速进行操作,则可以对角色周围的颜色缓冲区进行采样,或者仅在移动方向上进行采样,以确定障碍物是否在附近。