Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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# 如何在x和y位置值与给定x和y匹配的列表中查找对象的索引_C#_List_For Loop_Xna - Fatal编程技术网

C# 如何在x和y位置值与给定x和y匹配的列表中查找对象的索引

C# 如何在x和y位置值与给定x和y匹配的列表中查找对象的索引,c#,list,for-loop,xna,C#,List,For Loop,Xna,我正在创建一个使用瓷砖系统的游戏。每个平铺都是一个对象,其位置有一个矢量2。我有名单上的每一块瓷砖 我还有一段代码,生成了一组向量2,树应该放在瓷砖网格上。每个树位置都位于列表中的向量2中 我的问题是,如何找到与树坐标列表中的坐标完全匹配的磁贴索引。一旦找到,我就可以告诉列表中的tile对象将其treePresent布尔值转换为true 平铺的gridPosition.X和gridPosition.Y: 0(1,9)1(1,10)2(2,1)3(2,2) 树的树位。X和树位。Y: 0(1,9)1

我正在创建一个使用瓷砖系统的游戏。每个平铺都是一个对象,其位置有一个矢量2。我有名单上的每一块瓷砖

我还有一段代码,生成了一组向量2,树应该放在瓷砖网格上。每个树位置都位于列表中的向量2中

我的问题是,如何找到与树坐标列表中的坐标完全匹配的磁贴索引。一旦找到,我就可以告诉列表中的tile对象将其treePresent布尔值转换为true

平铺的gridPosition.X和gridPosition.Y: 0(1,9)1(1,10)2(2,1)3(2,2)

树的树位。X和树位。Y: 0(1,9)1(2,2)

我可以说: tileList[0]。treePresent=true; tileList[3]。treePresent=true

试试看

tileList.Where(t => treeList.Contains(t.Position));
如果要移动对象,请注意这会比较浮点相等,这可能会导致问题。

试试看

tileList.Where(t => treeList.Contains(t.Position));

如果要移动对象,请注意这会比较浮点相等,这可能会导致问题。

您也可以创建一个2维列表,并仅在树位置处引用平铺。除非您要更改网格大小,否则您不需要使用动态列表,而是可以创建一个二维数组。您还可以创建一个二维列表,并仅在树位置处引用平铺。除非您正在更改网格大小,否则您不需要使用动态列表,而是可以创建二维数组

使用平铺系统的游戏不应使用动态系统(列表)来跟踪平铺。 我假设“平铺系统”指的是划分为2D网格的整个游戏世界/地图。原因有两方面:

  • 您可能会使用更多内存来存储完整的数据映射。如果在你的世界里真的没有太多事情发生,而你大部分(80%或更多)只会看到一个空白/默认背景磁贴,那么这个规则可能被证明是无效的。但是,对于具有合理数据量的所有情况(这是我在这里假设的),您将使用更多内存,因为您必须存储平铺类型和x&y坐标,而不仅仅是存储平铺类型
  • 动态数据结构效率低下。以这种方式获取磁贴数据将花费很长时间,因为您必须在整个列表中循环查找特定的磁贴。因此,如果您想要平铺(a,b),您必须循环遍历所有平铺(找到正确的平铺后停止),并将每个平铺的每个(x,y)与(a,b)进行比较。听起来不是很有效率,是吗
  • 因此,解决方案很简单: 制作二维瓷砖阵列。第一个维度是x坐标,第二个维度是y坐标

    例如: worldData[x][y](或您选择的等效语言)。以这种方式,找到一个瓷砖是非常迅速的。在这里,如果我想要tile(a,b),我只需将worldData[a][b]称为。不需要循环或比较


    有问题吗?

    使用互动系统的游戏不应使用动态系统(列表)来跟踪互动。 我假设“平铺系统”指的是划分为2D网格的整个游戏世界/地图。原因有两方面:

  • 您可能会使用更多内存来存储完整的数据映射。如果在你的世界里真的没有太多事情发生,而你大部分(80%或更多)只会看到一个空白/默认背景磁贴,那么这个规则可能被证明是无效的。但是,对于具有合理数据量的所有情况(这是我在这里假设的),您将使用更多内存,因为您必须存储平铺类型和x&y坐标,而不仅仅是存储平铺类型
  • 动态数据结构效率低下。以这种方式获取磁贴数据将花费很长时间,因为您必须在整个列表中循环查找特定的磁贴。因此,如果您想要平铺(a,b),您必须循环遍历所有平铺(找到正确的平铺后停止),并将每个平铺的每个(x,y)与(a,b)进行比较。听起来不是很有效率,是吗
  • 因此,解决方案很简单: 制作二维瓷砖阵列。第一个维度是x坐标,第二个维度是y坐标

    例如: worldData[x][y](或您选择的等效语言)。以这种方式,找到一个瓷砖是非常迅速的。在这里,如果我想要tile(a,b),我只需将worldData[a][b]称为。不需要循环或比较


    有什么问题吗?

    我如何将一个平铺对象与一个数组的特定坐标相关联,这样当我拥有二维数组时,我就可以调用该平铺了?我是否为每个平铺位置创建一个数组?如果是,瓷砖如何知道它是它的?我不太理解你最后几句关于调用它的话,主要是因为我自己对C#array相当陌生;我已经习惯了使用列表。我自己也不懂C#语法,也许有人能帮上忙。但数组背后的基本思想是它是一组特定变量或对象。因此,如果您创建了一个包含10个整数元素的一维数组,那么您可以将它们作为intArray[0]、intArray[1]、intArray[2]等进行访问(其中intArray只是我为数组定义的名称)。2D数组与之类似,只是这里有两个索引(intArray[0][0]、intArray[1][0]、intArray[0][1]等等)。因此,假设您想要的世界是1000 x 1000个平铺。你将首先制作一个瓷砖类。其次,您可以制作一个瓷砖阵列。或者,如果每个磁贴都有唯一的ID,则可以使用该ID。假设ID0是草,ID1是水,ID2是树,等等。然后你可以像上面描述的那样创建一个2D整数数组(声明数组的细节你必须自己查找,因为我不知道C#语法)。然后您可以说tiles[0][0]=1,将位置(x=0,y=0)处的tile设置为ID1M,在本例中为水。如果您使tiles[5][120]=0,则(x=5,y=120)将表示草。要在屏幕上绘制相关的分幅,您需要在2D数组的相关部分循环