与MANY对象的碰撞检测

我主要关注Graphics方面来创建一个2DGame。 我看过/看过几个教程,但没有一个是令人高兴的。 我已经有一个玩家(一个正方形)移动并与屏幕上的其他方块相撞。 重力等也完成了。

如果屏幕上只有那么多的物体(30 * 20),一切都很好。 但是如果我把它增加到300 * 300,程序开始运行得很慢,因为它必须检查这么多的对象。

我真的不明白像Minecraft这样的游戏可以和所有这些块一起使用,我的程序已经放弃了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++; } } } 

优化碰撞检测的常用方法是使用空间分区来对对象进行分类/管理。

该方法的一般思想是,您可以构建一个表示空间的树,并根据其位置将对象放入该树中。 计算碰撞时,您将遍历树。 这样,您将不得不执行比使用powershell方法少得多的计算,因为您将忽略除了您正在遍历的分支之外的所有对象。 Minecraft和类似的可能使用八叉树进行碰撞(也可能用于渲染)。

最常见的空间分区结构是BSP-Trees , kd-Trees (一种特殊类型的BSP树)。 更简单的方法是使用统一的空间分区作为开始 – 以轴对齐的一半分割您的空间。

我发现的最好的碰撞资源就是这本书 。 它应该澄清你对这个主题的所有问题。

如果你想做得对,那就是这样。 如果你想快速做到这一点,你可以只在角色周围采样颜色缓冲区,或者只在运动方向上采样,以确定障碍物是否接近。

正如Kostja所说,分割你的空间对你有用。 但是,您需要使用QuadTrees而不是Octrees,因为您只使用2D而不是3D。 这是一篇很棒的文章 ,可以帮助您开始使用QuadTrees。

您可以将开销减少4倍,而不是计算上/下/左/右碰撞,计算一次碰撞并使用两个物体的相对位置来确定您是否碰到地板,墙壁或天花板。 另一个好主意是只注意附近的物体 – 可能每0.25秒就会生成一个列表,列出可能在接下来的0.25秒内碰到的所有物体?