我有一个数组,我用它来存储我正在制作的游戏的地图数据。
MyMapType[,,] map;
我使用固定数组而不是集合的原因是固定数组的工作速度非常快。
现在我的问题是,我希望在游戏中支持负z关卡。所以我希望能够访问一个负索引
如果这是不可能的,我想到了两个其他的解决方案。
我在想一个可能的解决方案,把地面高度作为一个任意的数字(比如10),任何小于10的都可以被认为是负的。但是如果它不被使用,这不会让数组变大10倍吗?
我考虑的另一个解决方案是"滚动我自己的",你有一个2D数组的字典,在列表中保存Z级作为索引。但是这需要更多的工作,我不确定它是否很慢。
所以总结一下——有什么方法可以创建一个支持负索引的数组吗?如果没有,是否有一种干净的方式来"模拟"这种行为,而不牺牲太多的CPU时间或RAM -注意这些游戏地图可能最终会很大,需要不断访问。用类替换数组:
class MyArray {
private MyMapType[] myArray = new myMapType[size]
MyMapType this[index] {
get{return myArray[index + offset];}
}
}
可以在构造函数中设置大小和偏移量,甚至可以随意更改。
在这个例子的基础上,这里是另一个版本:
class MyArray {
private MyMapType[] positives = new myMapType[size]
private MyMapType[] negatives = new myMapType[size-1]
MyMapType this[index] {
get{return index >= 0 ? positives[index] : negateves[1-index];}
}
}
它不会改变您需要为它们设置大小的事实。老实说,我更喜欢第一个
如果你想"negative"c# 8现在支持索引
var words = new string[]
{
// index from start index from end
"The", // 0 ^9
"quick", // 1 ^8
"brown", // 2 ^7
"fox", // 3 ^6
"jumps", // 4 ^5
"over", // 5 ^4
"the", // 6 ^3
"lazy", // 7 ^2
"dog" // 8 ^1
}; // 9 (or words.Length) ^0
所以要调用负的就像这样
words[^1]
查看此链接
在这里中间的元素可以是0 Z
使用Dictionary类,因为您可以为键或值分配任何您想要的值。虽然我不确定这对于您上面展示的三维数组是如何工作的,但我可以展示如果这是一个一维数组是如何工作的,并且您可以推断如何最好地利用它:
MyMapType[] map;
//map is filled with w/e data
Dictionary<int, MyMapType> x = new Dictionary<int, MyMapType>();
x[-1] = //(map data for whatever value is for the negative value);
x[0] = map[0]
//(etc...)
是否可以尝试在两个列表中存储MyMapTime[,]列表:
- 1表示z值大于或等于0
- 和第二个负z值。
表的索引将是z的值。这样你就可以快速访问特定z水平的xy值。当然问题是,z值是多少?是稀疏的还是密集的?即使对于稀疏值,您最终也会得到一个数组,其中包含[,]的空值。
我想在这里指出,字典允许使用负索引2D字典也可以解决这些问题,想想数据结构,如果你能忍受字典
注意字典和列表在不同的场景中使用。它们的速度取决于在它们上面使用了什么函数