Haxe Map只检索`null`

问题描述 投票:0回答:1

我在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);
        }
    }
}
dictionary multidimensional-array haxe
1个回答
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(打开浏览器控制台查看跟踪)。

© www.soinside.com 2019 - 2024. All rights reserved.