vector2数组的列表

本文关键字:列表 数组 vector2 | 更新日期: 2023-09-27 17:49:53

我在XNA上制作一款2D游戏,NPC精灵都聚集在一起,看起来像是一个精灵。我认为解决这个问题的方法是对所有精灵进行碰撞检测,让它们彼此远离,但这意味着一帧要做数百次检查。

然后我决定将游戏窗口分解为一个grid (6*6),并将每个精灵放入36个数组中的一个,所以我只需要在同一象限中检查每个精灵与其他精灵的对比。这是我现在的问题,因为我正在检查位置,这是一个Vector2,我不知道如何把它们都放在相关的网格正方形中。

如果我有什么不清楚的地方,请告诉我,我会尽力改进的。

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呢?如果你不想使用它,你可能会寻找四叉树,游戏中有一些很好的四叉树实现。我更喜欢一个完全扩展的四叉树,它比正常的四叉树更快,但我在网上找不到任何关于它的文章。我的邮箱里有一篇关于这个的扫描文章,但我不会在这里发布。

基本上你可以这样做来检查四叉树中的相关节点:

  • 检查对象是否适合根节点(如果不适合,对象在顶部节点)
  • 检查4个子节点,如果对象适合其中一个。处理此过程,直到对象不适合任何子节点,然后将其添加到当前节点。
  • 当处理场景时,找到包含实际对象的节点(将其保存在包含对象中),现在走到父节点直到到达根节点并检查每个节点的碰撞。
  • 四叉树示例