Haxe Map只检索`null`

时间:2014-05-17 00:40:30

标签: dictionary multidimensional-array haxe

我在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);
        }
    }
}

1 个答案:

答案 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(打开浏览器控制台查看跟踪)。