如何管理图块地图和单位之间的依赖关系


11

我在作品中有一个基于2D切片的策略。我在徘徊如何处理地图和地图上单位之间的关系。

给定一个平铺坐标,我将需要使该单元站立在上面(如果有)。同时,如果给定一个单位,我将希望能够获得该单位的坐标。

我已经看到了两种解决方案。第一种解决方案是让单位存储一个坐标,而地图将单位引用存储在其图块中。这在地图和单位之间创建了循环依赖性。如果单元移动,我需要确保地图和任何单元保持同步。

第二种解决方案是只让单位跟踪其坐标。为了判断图块是否包含一个单位并获取该单位,我将遍历整个单位单元,找到一个具有匹配坐标的单位。这样就摆脱了循环依赖,但是却失去了第一个解决方案从地图中查找单位所具有的O(1)属性。由于我希望能够定期扫描地图以查找诸如路径查找,确定运动范围以及为给定单位找到有效目标之类的信息,因此这可能会加起来。

我也不能只将单位存储在地图中(或者可以吗?)。单位与玩家或AI的“军队”相关联。一支军队应该能够轻松地访问和遍历其所有部队。

由于这似乎是战略游戏中的常见问题,除了我描述的两种用于管理单位/地图关系的模式之外,还有其他模式吗?

Answers:


3

它不是一种流行的模式,但是关系数据库世界提供了第三种方式:使用具有多个键的数据结构。以表格形式,它可能看起来像这样:

Unit id    Location
-------------------
  1309     13,15
  2357      7,93
  8552      7,93

您想问,“ 2357单元在哪里?” 然后取回7,93。您还希望能够问:“ 7.93位置在哪里?” 并返回2357和8552。有些数据结构允许使用多个键查找内容。如果要删除依赖关系,可以将其存储在单位外部和地图外部。

但是,在实践中,通常将位置存储在每个单元中,然后在一侧使用空间分区数据结构,该结构告诉您在给定区域中的单元。由于它是一个独立的结构,因此区域不必是网格空间。他们可以是更大的区域。

我建议您做任何最简单的事情(第二种解决方案),然后,如果这是性能问题,则可以添加空间分区以加快查找速度。


因此,您提到的空间分区数据结构可能只是地图(在我的情况下,表面上是2D瓦片网格)。我假设当一个单元移动(或添加或删除)时,我仍然需要同时更新该单元和空间分区结构,以使其保持同步。也许这是我必须忍受的事情之一?
AJM

1
是的,地图是您要使用的最细粒度的空间分区。所有单元的全局列表是最粗糙的分区。;)您只需要在使用分区之前更新分区即可。如果您一直在使用它,则每次移动设备时都可能要对其进行更新。但是,如果仅将其用于更新逻辑的某些阶段,则可以一遍遍地遍历单元列表并计算分区数据结构,然后在完成后将其丢弃。这样,您就不必一直保持同步。
2011年

5

好吧,除非您每个玩家有数千个单位,否则我不会担心内存使用情况,而是使用第一个解决方案。内存似乎比CPU便宜。

实际上,即使您每个玩家有4000个单位,使用两个整数存储该位置,还有8个玩家,这仅占用2MB,但是在第一个解决方案中,您将使用O(1)坐标获取器,而不是O(n)(假设未排序),单位很多会很慢。

如今,大多数游戏似乎都是基于像素的,而不是平铺的,因此它们只需要获取单位即可存储坐标。


我不担心内存使用,我对管理依赖项(从面向对象设计的角度)更感兴趣。我担心的不是第一个解决方案需要的额外内存,而是我所讨厌的循环依赖关系,就像我喜欢O(1)坐标获取器一样。另外,我知道很多游戏现在都是基于像素的,但是我喜欢图块,所以这就是我正在使用的。:P
AJM

@AJM,同样,我将在Android上发布的付费应用将使用图块。
雷·布里顿
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.