关于tiled:Haxe-为什么我不能访问孩子的属性而没有得到父母没有给定属性的错误?

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对象,并将其传递给TMX文件路径,然后我要遍历该对象中的图层以将它们添加到游戏场景中。但是,当我尝试访问.tileArray(这是TiledTileLayer的属性)时,出现以下错误:-

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

这是代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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,它似乎对人们来说还算不错。

所以我想检查图层对象是否是应具有的TiledTileLayer或TiledLayer,并具有以下内容:

1
trace(Type.typeof(layer));

哪个肯定足够产量:

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

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

我看了一下源代码(https://github.com/HaxeFlixel/flixel-addons/blob/dev/flixel/addons/editors/tiled/TiledMap.hx#L135),TiledTileLayer继承自TiledLayer。图层是TiledLayer类型的数组,所以我认为这就是它抱怨的原因。我可以清楚地看到该数组正在存储TiledLayer的子对象,但是一旦我访问了这些子对象的任何道具/方法,它就会抱怨父对象没有该字段?非常混淆!

要运行,我使用以下命令: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,但并非总是如此。 毕竟layersArray,因此它也可以是TiledObjectLayerTiledImageLayer(没有tileArray字段)。 您可以在链接的代码中很好地看到这一点。 具体类型只能在运行时知道,但您得到的错误将在编译时发生。

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

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

在您链接的教程中,如果没有此功能,它将无法正常工作,因为它是针对较旧版本的flixel-addons开发的。