vector2数组列表

时间:2012-12-30 15:42:19

标签: c# arrays list vector xna

我正在XNA中制作2D游戏,而NPC精灵们正在组合成一个质量,看起来像是一个精灵。我认为解决这个问题的方法是对所有精灵进行碰撞检测,然后将它们彼此远离,但这意味着每帧进行数百次检查。

然后我决定将游戏窗口分解为grid (6*6),并将每个精灵放入36个阵列中的一个,所以我只需要在同一象限中检查每个精灵对彼此的精灵。这是我的问题,因为我正在检查位置,Vector2,我不知道如何将它们全部放在相关的网格方块中。

如果我在任何地方都不清楚,请告诉我,我会尽力改进它。

2 个答案:

答案 0 :(得分:2)

这肯定不是最优化的方式,但以下可能是一个简单的方法。 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;
}

答案 1 :(得分:1)

第一:为什么不使用Box2d?如果你不想使用它,你可能会寻找quad-tree,有一些很好的四叉树实现游戏。我更喜欢一个完全展开的四叉树,比正常的更快,但我找不到任何关于它的文章。我在我的邮箱中有关于此的扫描文章,但我不会在此发布。

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

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