0

AS3 でローダー クラスのイベント ハンドラーとしてインライン関数を作成しています。このインライン関数では、関数のスコープ外の変数にアクセスする必要があるという問題があります。

私が実行しているコードは次のとおりです。

for(var i:uint=0;i<numChildren;i++){;
var displayObj:DisplayObject = getChildAt(i);
var displayObjWidth = displayObj.width;

if (elementname == displayObj.name)
{
    var loader:Loader = new Loader();
    var urlRequest:URLRequest = new URLRequest(loadURL);
    loader.load( urlRequest );
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, function(e:Event){
                                              var mw:Number = displayObj.width;
                                              var mh:Number = displayObj.height;
                                              var tempImage:Bitmap = new Bitmap(e.target.content.bitmapData);
                                              image.bitmapData = tempImage.bitmapData;
                                              image.width = mw;
                                              image.height = mh;
                                              loader.width = displayObj.width;
                                              loader.height = displayObj.height;});
    loader.x = displayObj.x;
    loader.y = displayObj.y;
    addChild( loader );
    removeChild( displayObj );
}

この関数は、URL から画像を読み込み、一致する子要素を見つけて、既存の画像を読み込まれた新しい画像に置き換えます。

私が抱えている問題は、Loader クラスを介してロードされた新しいオブジェクトに置き換える元の表示オブジェクトの高さと幅にアクセスできることです。

関数のスコープ外でこれらの変数にアクセスしたり、関数に渡したりするにはどうすればよいですか?

4

1 に答える 1

3

まず第一に、頭の痛い問題を解決するために、イベント ハンドラーを別の非匿名関数に配置する必要があります。そうしないと、あらゆる種類のスコープの問題が発生する可能性があります。

次に、ディクショナリを使用して、必要なイメージ/表示オブジェクトの関係を作成できます。基本的に、ローダーを作成するときは、それをディクショナリにキーとして保存し、displayObj を値として保存します。

そのようなものはうまくいくはずです:

private var imageToDisplayObj:Dictionary = new Dictionary();

function loader_complete(e:Event){
    var displayObject:* = imageToDisplayObj[event.currentTarget];
    // Do something with the display object
}); 

for(var i:uint=0;i<numChildren;i++){;
var displayObj:DisplayObject = getChildAt(i);
var displayObjWidth = displayObj.width;

if (elementname == displayObj.name)
{
    var loader:Loader = new Loader();
    var urlRequest:URLRequest = new URLRequest(loadURL);
    loader.load( urlRequest );

    // Map the loader to the display object
    imageToDisplayObj[loader] = displayObj;

    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loader_complete);
    loader.x = displayObj.x;
    loader.y = displayObj.y;
    addChild( loader );
    removeChild( displayObj );
}
于 2011-12-22T14:23:32.753 に答える