我正在制作一个世界向各个方向无限延伸的游戏。这意味着您可以处于以下位置X:50
, Y:50
or X:-50
, Y:-50
。但是......我真的无法用普通的 C# 列表做到这一点......
我想出的所有想法似乎都太复杂/效率低下,无法实现......
实现无限网格的最简单方法是使用稀疏矩阵和字典,以 x,y 对作为键,将要存储的数据作为值。如果您的网格稀疏,那么这种方法速度快、易于实现并且内存友好。
另一种方法是链接网格(类似于链接列表,但具有指向 4 个方向的指针),或基于图块的方法来减少链接网格的开销(图块是 NxN 数组的链接网格)。图块的实现相当复杂,但对于非常密集的网格来说,这是内存和性能之间的一个很好的权衡。
但我个人最喜欢的方法是使用奇偶变换。所以奇数索引是正数,而偶数索引是负数。要将虚拟索引转换为物理索引,请使用以下公式p = abs(v * 2) - (v > 0 ? 1 : 0)
并将物理索引转换为虚拟索引v = (p % 2 == 1 ? +1 : -1) * ((2*p + 3) / 4)
。这种关系的出现是因为自然数和整数之间存在一对一的关系(双射)(0 <-> 0), (1 <-> 1), (2 <-> -1), (3 <-> 2), (4 <-> -2), (5 <-> 3), (6 <-> -3), ...
。这种方法快速、简单且优雅,但当网格非常稀疏且项目距离中心线非常远时,记忆力就不是很好。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)