3

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

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

flixel.addons.editors.tiled.TiledLayer 没有字段 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似乎对人们来说效果很好。

所以我想检查图层对象是应该是 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 的子对象,但是一旦我访问这些子对象的任何道具/方法,它就会抱怨对象没有该字段?非常混乱!

要运行,我使用以下命令:C:\HaxeToolkit\haxe\haxelib.exe runlime test flash -debug -Dfdb

谢谢!

4

1 回答 1

1

因此,如果它是具有 tileArray 字段的 TiledTileLayer,为什么它会呻吟?

TiledTileLayer这种情况下可能是,但可能并非总是如此。毕竟是 a,所以它也可以是 alayers或a (没有字段)。这可以很好地在您链接的代码中看到。具体类型只能在运行时知道,但你得到的错误发生在编译时。Array<TileLayer>TiledObjectLayerTiledImageLayertileArray

如果您确定不会有任何对象或图像层,则可以将其转换为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 制作的。

于 2017-12-28T00:00:05.657 回答