Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 矢量2数组的列表_C#_Arrays_List_Vector_Xna - Fatal编程技术网

C# 矢量2数组的列表

C# 矢量2数组的列表,c#,arrays,list,vector,xna,C#,Arrays,List,Vector,Xna,我正在用XNA做一个2D游戏,NPC的精灵都聚在一起,看起来像一个精灵。我认为解决这个问题的一种方法是对所有精灵进行碰撞检测,然后将它们彼此移开,但这意味着每帧要进行数百次检查 然后,我决定将游戏窗口分解成一个网格(6*6),并将每个精灵放入36个阵列中的一个,因此我只需在同一象限中检查每个精灵与另一个精灵。这是我现在的问题,因为我正在检查位置,它是一个矢量2,我不知道如何将它们都放在相关的方格中 如果我有不清楚的地方,请告诉我,我会尽力改进。首先:为什么不使用?如果你不想使用它,你可能会寻找一

我正在用XNA做一个2D游戏,NPC的精灵都聚在一起,看起来像一个精灵。我认为解决这个问题的一种方法是对所有精灵进行碰撞检测,然后将它们彼此移开,但这意味着每帧要进行数百次检查

然后,我决定将游戏窗口分解成一个
网格(6*6)
,并将每个精灵放入36个阵列中的一个,因此我只需在同一象限中检查每个精灵与另一个精灵。这是我现在的问题,因为我正在检查位置,它是一个
矢量2
,我不知道如何将它们都放在相关的方格中

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

首先:为什么不使用?如果你不想使用它,你可能会寻找一个,有一些很好的四叉树游戏实现。我更喜欢一个完全扩展的四叉树,它比普通的四叉树快,但是我在网上找不到任何关于它的文章。我的邮箱里有一篇关于这个的扫描文章,但我不会在这里发布

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

  • 检查对象是否适合根节点(如果不适合,则对象位于顶部节点)
  • 检查4个子节点,如果对象适合其中一个子节点。处理此操作,直到对象不适合任何子节点,然后将其添加到当前节点
  • 在处理场景时,找到包含实际对象的节点(保存在包含对象中),现在向上走到父节点,直到到达根节点并检查每个节点中的碰撞
  • 四叉树
    • 首先:为什么不使用?如果你不想使用它,你可能会寻找一个,有一些很好的四叉树游戏实现。我更喜欢一个完全扩展的四叉树,它比普通的四叉树快,但是我在网上找不到任何关于它的文章。我的邮箱里有一篇关于这个的扫描文章,但我不会在这里发布

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

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

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

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