Haxe - 为什么我不能访问 child 的属性而不会收到 parent 没有给定属性的错误?

Haxe - Why can I not access a child's attribute without getting an error that the parent does not have the given attribute?

我最近接触了 Haxe,并且刚开始使用 HaxeFlixel 加载 Tiled .TMX 文件。

我正在创建一个 TiledMap object 并将 TMX 文件路径传递给它,然后我想遍历 object 中的图层以将它们添加到游戏场景中。但是,当我尝试访问 .tileArray(它是 TiledTileLayer 的 属性)时,出现以下错误:-

flixel.addons.editors.tiled.TiledLayer has no field tileArray

代码如下:

package;

import flixel.FlxState;
import flixel.tile.FlxTilemap;
import flixel.addons.editors.tiled.TiledMap;
import openfl.Assets;


class PlayState extends FlxState
{
    private var _tiled_map:TiledMap;

    override public function create():Void
    {
        _tiled_map = new TiledMap("assets/data/Map1.tmx");

        for(layer in _tiled_map.layers){
            var layerData:Array<Int> = layer.tileArray;
        }

        super.create();
    }

    override public function update(elapsed:Float):Void
    {
        super.update(elapsed);
    }
}

我找到了以下示例 - http://coinflipstudios.com/devblog/?p=182 似乎对人们来说效果很好。

所以我想检查图层 object 是应该是 TiledTileLayer 还是 TiledLayer,具有以下内容:

trace(Type.typeof(layer));

肯定会产生:

PlayState.hx:24: TClass([class TiledTileLayer])

那么,如果它是一个具有字段 tileArray 的 TiledTileLayer,为什么它会抱怨?

我看过源代码(https://github.com/HaxeFlixel/flixel-addons/blob/dev/flixel/addons/editors/tiled/TiledMap.hx#L135),TiledTileLayer 继承自TiledLayer。 Layers 是 TiledLayer 类型的数组,所以我认为这就是它抱怨的原因。我可以清楚地看到数组正在存储 TiledLayer 的 child objects,但是一旦我访问这些 children 中的任何 props/methods,它就会抱怨 parent没有那个字段?非常混乱!

To 运行 我正在使用这个命令:C:\HaxeToolkit\haxe\haxelib.exe 运行 lime test flash -debug -Dfdb

谢谢!

So if it is a TiledTileLayer which has the field tileArray why is it moaning?

这种情况下可能是TiledTileLayer,但情况可能并非总是如此。 layers 毕竟是 Array<TileLayer>,所以它也可能是 TiledObjectLayerTiledImageLayer 没有 tileArray 字段)。这可以在 the code you linked 中很好地看到。具体类型只能在运行时知道,但你得到的错误发生在编译时。

如果您确定不会有任何对象或图像层,您可以将其转换为 TiledTileLayer。但是,为了安全起见,最好还是事先检查一下类型:

for (layer in _tiled_map.layers) {
    if (Std.is(layer, TiledTileLayer)) {
        var tileLayer:TiledTileLayer = cast layer;
        var layerData:Array<Int> = tileLayer.tileArray;
    }
}

对于您链接的教程,它可以在没有这个的情况下工作,因为它是为旧版本的 flixel-addons 制作的。