如何在 Haxeflixel 中加载简单的 tmx 文件?

How to load simple tmx file in Haxeflixel?

我正在尝试使用 flixel-addons 库在我的 haxeflixel 应用程序中使用简单的 tmx 地图。

我的 tmx 地图只有一个图层,其中包含所有图块。地图没有什么特别之处。 我尝试使用 TiledMap 演示作为参考,并删除了所有我认为不需要的代码。

这是我自定义的地图类;

class MapLoader extends TiledMap
{
    // Array of tilemaps used for collision
    public var backgroundTiles:FlxGroup;

    public function new(tiledLevel:Dynamic)
    {
        super(tiledLevel);

        backgroundTiles = new FlxGroup();

        FlxG.camera.setBounds(0, 0, fullWidth, fullHeight, true);

        // Load Tile Maps
        for (tileLayer in layers)
        {

            var processedPath = "assets/images/tiles/sheet.png";
            trace(processedPath);

            var tilemap:FlxTilemap = new FlxTilemap();
            tilemap.widthInTiles = width;
            tilemap.heightInTiles = height;
            tilemap.loadMap(tileLayer.tileArray, processedPath, 128, 64, 0, 1, 1, 1);

            backgroundTiles.add(tilemap);

        }
    }

}

我在 PlayState 中这样调用它;

    // Load the tilemap
    _map = new MapLoader(AssetPaths.map__tmx);

    // Load the tilesets
    add(_map.backgroundTiles);

我不断收到的错误是;

flixel.addons.editors.tiled.TiledMap has no field backgroundTiles

但是,在我看来,我确实按照演示中的方式添加了这个字段。 我做错了什么?我在 Haxe/Haxeflixel 方面的专业水平是初学者水平。

要快速查看代码,请参阅 https://github.com/rishavs/KingdomFail_Haxe/

我指的演示源在 https://github.com/HaxeFlixel/flixel-demos/tree/master/Editors/TiledEditor/source

而不是

private var _map:TiledMap;

尝试做:

private var _map:MapLoader;

否则编译器不会意识到该实例实际上具有您在子类中声明的属性。

在设计方面,您可能需要考虑将 MapLoader 定义为 TiledMap 的子类是否真的有意义。在我看来,您只需要一些功能即可创建您正在寻找的 FlxGroup

实际上,我使用了一种简单的方法,使用较少的 add-on/external 代码,只需在 Json 中导出地图,然后使用本机 Haxe Json 解析器。

var tmxTxt:String = File.getContent("assets/data/level-1.json");
var tmxData = Json.parse(tmxTxt);
trace(tmxData.layers[1].data);

然后我可以访问 tmx 中的所有内容

FlxG.worldBounds.width = tmxData.width * tmxData.tilewidth;
FlxG.worldBounds.height = tmxData.height * tmxData.tileheight;

_collisionMap = new FlxTilemap();
_collisionMap.loadMapFromArray(tmxData.layers[1].data, tmxData.width, tmxData.height, "assets/images/mariou-tileset.png", TILE_WIDTH, TILE_HEIGHT, null, 1);
add(_collisionMap);

使用这种方式我独立于 Tiledmap 插件,所以我不关心是否有新的东西添加到 tmx 格式,我只需要更改我的代码。

Haxeflixel 网站上提供的当前 Tiled 示例使用了一种非常奇怪的方法,需要一些私有属性来获取 tileset 名称...而所有内容都是 tmx 格式并且易于阅读 Json.