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

时间:2015-01-05 13:19:42

标签: haxe tmx tiled 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

2 个答案:

答案 0 :(得分:3)

而不是

private var _map:TiledMap;

尝试做:

private var _map:MapLoader;

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

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

答案 1 :(得分:0)

实际上,我使用一种简单的方法,使用较少的附加/外部代码,只需在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读取。