如何存储瓷砖的“块”或如何使我的实施工作

我问了一个关于块数据加载和卸载的前一个问题,人们指出我的存储块的方式很奇怪,我想知道如何正确地做这件事。 @ Byte56建议使用链表或邻接表,但我不知道如何做这些甚至search谷歌/ stackoverflow后。 任何对xna编程新手的建议?

资源

上一个问题

我认为经典雷霆正朝着正确的方向前进,但他/她可能处于错误的层面。 在Chunk级别保留一个邻接表是好的,但这不是真正的解决scheme,你想要在世界级别管理已加载的块。

如果您要将字块的实际数据保存在字典结构中,那么您真正需要的是一组键,在您的大小写位置中。 在我考虑更多之后,这其实相当简单。 为了知道哪些块应该被加载,所有你真正需要的是摄像机当前结束的块的根位置。 现在,您知道每个块的大小,并且您可以计算出一次需要显示多less个块。 所以一旦你有根的位置,真正的只是几个循环给你所有其他所需的块的位置。

所以举个例子,假设你决定一次装9个块就行得通。 这意味着相机当前结束,加上所有的块水平和对角地触摸它。 这意味着视图面积不会大于单个块。

int range = 1; //This is the number of chunks from the center chunk to load ChunkPosition rootPos = GetChunkRootAt(Camera.Position.X, Camera.Position.Y); ChunkPosition[] Positions = new ChunkPosition[9]; int i = 0; for(int y = rootPos.Y + (ChunkSize.Y * range); y >= rootPos.Y - (ChunkSize.Y * range); y -= ChunkSize.Y){ for(int x = rootPos.X - (ChunkSize.X * range); x <= rootPos.X + (ChunkSize.X * range); x += ChunkSize.X){ Positions[i++] = new ChunkPosition(x,y); } } 

我只是在我脑子里运行这个,所以我可能是一个或某个东西,但我相信上面将填充该configurationarrays:

 [0][1][2] [3][4][5] [6][7][8] 

现在你有一个应该加载的块的列表。 使用该列表来更新您的字典。

我们推荐的是将每个块视为图中的一个节点。 修改你的chunk数据结构是做这个邻接表的必要条件。 注意列表部分不是必须指定一个列表,我建议一个数组出于性能原因和他们的简单性。

数据结构应至less包含以下两个字段。

 public class Chunk { private Point position private Tile Tiles[] private Chunk AdjacencyArray = new Chunk[8] } 

这允许下面。 “@”是当前块。 0是当前块左上角的块。 1是当前块之上的块。 如此等等以上AdjacencyArray字段的所有索引。

 [0][1][2] [7][@][3] [6][5][4] 

现在假设我们在网格中有多个块1,2和3

 [ ][ ][ ][ ] [ ][1][2][ ] [ ][3][ ][ ] [ ][ ][ ][ ] 

块1的AdjacencyArray应该是

 AdjacencyArray = { null, null, null, Chunk2, null, Chunk3, null, null } AdjacencyArray[3] = Chunk2 AdjacencyArray[5] = Chunk3 

块2的AdjacencyArray应该是

 AdjacencyArray = { null, null, null, null, null, null, Chunk3, Chunk1 } AdjacencyArray[6] = Chunk3 AdjacencyArray[7] = Chunk1 

块3的AdjacencyArray应该是

 AdjacencyArray = { null, Chunk1, Chunk2, null, null, null, null, null } AdjacencyArray[1] = Chunk1 AdjacencyArray[2] = Chunk2 

我希望说明一个邻接数组只是存储对块的引用。 并且该引用的索引描述了与当前块相比所引用块相关的位置。

现在让我们说相机在第二块,然后向下移动。 我们现在必须增加4.然后,我们必须更新所有的旧块(O),以便它们和新的块(N)指向对方。 有很多方法可以做到这一点,没有一个特别优雅。 事实上,我有点像你想像字典的位置作为一个哈希。 这将允许链接发生在基本上是O(8)。

 [ ][ ][ ][ ] [ ][ ][ ][ ] [ ][1][2][ ] [ ][O][O][ ] [ ][3][4][ ] [ ][O][N][ ] [ ][ ][ ][ ] [ ][ ][ ][ ]