我正在与一个向各个方向无限延伸的世界进行游戏.这意味着,你可以在位置X:50,Y:50或者X:-50,Y:-50.但是......我不能用普通的C#List真正做到这一点......
我提出的所有想法似乎都太复杂/无效,无法工作......
Lie*_*yan 15
实现无限网格的最简单方法是使用稀疏矩阵,其中包含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), ....这种方法快速,简单和优雅,但是如果你的网格非常稀疏,并且物品距离中心线很远,那么这种方法并不是很好.