2017-12-27 23 views
3

私は最近Haxeに入ってきて、HaxeFlixelを使ってTiled .TMXファイルを読み始めました。Haxe - 親が指定された属性を持っていないというエラーを出さずに、子の属性にアクセスできないのはなぜですか?

私はTiledMapオブジェクトを作成し、TMXファイルパスを渡しています。そのオブジェクトのレイヤーを繰り返してゲームシーンに追加したいとします。私は(TiledTileLayerのプロパティです).tileArrayにアクセスしようとすると、しかし、私は次のエラーを取得する: -

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 -Dfdb

-debug実行ライムテストフラッシュありがとうございました!

答えて

1

したがって、フィールドtileArrayを持つTiledTileLayerの場合、なぜそれが盛んですか?

それはTiledTileLayerこの場合があり得るが、それは必ずしもそうではないかもしれません。結局のところ、layersArray<TileLayer>なので、それはTiledObjectLayerまたはTiledImageLayerでもある可能性があります(であり、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-アドオンの古いバージョンのために作られたため、リンクされたチュートリアルのためにこれなしで動作します。

関連する問題