我在 XNA 中制作 2D 游戏,NPC 精灵都组合成一个整体,看起来像是一个精灵。我认为解决此问题的一种方法是对所有精灵进行碰撞检测,然后将它们彼此远离,但这意味着每帧要进行数百次检查。
然后我决定将游戏窗口分解为grid (6*6)
,并将每个精灵放入 36 个数组中的一个,因此我只需检查每个精灵与同一象限中的其他精灵。现在这是我的问题,因为我正在检查位置,即 a Vector2
,我不知道如何将它们全部放在相关的网格中。
如果我有不清楚的地方,请告诉我,我会尽力改进它。
这肯定不是最优化的方法,但以下可能是一种简单的方法。Felix K. 的回答可能会为您提供更高效的解决方案。如果您希望多个元素在网格中共享相同的位置,您可以通过将网格的类型从 更改Vector2
为Vector2[]
或听起来对您最方便的集合类型来调整示例。
//Size of each square
const int squareSize = 10;
const int gridSquares = 6;
var grid = new Vector2[gridSquares,gridSquares];
//Sample vectors
Vector2[] vectors =
{
new Vector2(0, 0),
new Vector2(25, 0),
new Vector2(20, 40),
new Vector2(59, 59)
};
foreach (var vector in vectors)
{
var x = vector.X/squareSize;
var y = vector.Y/squareSize;
grid[x, y] = vector;
}
第一:为什么不使用Box2d?如果您不想使用它,您可能会寻找四叉树,有一些很好的游戏四叉树实现。我更喜欢完全扩展的四叉树,它比普通的四叉树更快,但我在网上找不到任何关于它的文章。我的邮箱中有一篇关于此的扫描文章,但我不会在这里发布。
基本上你可以这样做来检查四叉树中的相关节点: