我在Haxe使用地图时遇到问题。我正在尝试创建一个Tile对象网格,并使用网格上的索引作为关键字将它们添加到Map中。但是,当我尝试使用索引从地图中检索Tile时,我总是得到null
的值。
有人可以解释为什么会这样吗?我之前从未使用过地图,我不明白这是什么问题。我目前正在使用多维数组来获得相同的功能,但地图似乎更方便。
private function initTiles():Void
{
var tempTile:Tile;
tileMap = new Map();
for (i in 0...widthTiles)
{
for (j in 0...heightTiles)
{
tempTile = new Tile(i * 32, j * 32);
tileMap.set([i,j],tempTile);
}
}
}
答案 0 :(得分:1)
问题在于,您实际上并未创建多维数组,而是创建一个键维类型为Array<Int>
的单维数组。如果有任何疑问,您可以使用$type( tileMap )
让编译器告诉您它认为您拥有的类型。
在你的情况下,你会得到:
Map<Array<Int>,Tile>; // This is an ObjectMap, where the object is an Array
当你真正想要的是:
Map<Int, Map<Int,Tile>>; // This is an IntMap, each value holding another IntMap
这是一个问题的原因可以在这一行看到:
trace( [0,0] == [0,0] ); // False!
基本上,在Haxe中,对象(包括数组)的相等性是基于它们是否是完全相同的对象,而不是它们是否具有相同的值。在这种情况下,您将比较两个不同的阵列。即使它们具有相同的值,它们实际上是两个不同的对象,并不相等。因此,他们没有为您的地图制作合适的钥匙。
以下是您需要做的工作示例:
class Test {
static function main() {
initTiles();
trace( tileMap[3][6] );
}
static var tileMap:Map<Int,Map<Int,Tile>>;
static function initTiles():Void {
var widthTiles = 10;
var heightTiles = 10;
tileMap = new Map();
for (i in 0...widthTiles) {
if ( tileMap[i]==null ) {
// Add the sub-map for this column
tileMap[i] = new Map();
}
for (j in 0...heightTiles) {
// Add the tile for this column & row
tileMap[i][j] = new Tile(i*32, j*32);
}
}
}
}
class Tile {
var x:Int;
var y:Int;
public function new(x:Int, y:Int) {
this.x = x;
this.y = y;
}
}
要查看它的实际效果:http://try.haxe.org/#E14D5(打开浏览器控制台查看跟踪)。