1

外部ビットマップ ファイルを塗りつぶしとして使用する関数を呼び出す前に、 Loader クラスを使用してビットマップ ファイルを Flash Player にロードし、ローダーがロードを終了して起動し、対応するイベント ハンドラを実行するのaddNodeFilled()を待つ必要があります。これを確実にするために、ロードの完了を待つ while ループがありますが、プログラム esp を実行すると、ループが無限に続きます。つまり、フラッシュでは、イベント ハンドラーがメイン シーケンスと同期して実行され、終了するまで実行できません。 . 通常、コードはイベント ハンドラー内に配置されますが、それを行うことができず、いつでも呼び出す必要がありますが、ロードの完了を確認する必要があります。どうすればよいですか?Event.COMPLETEonComplete()addNodeFilled()addNodeFilled()addNodeFilled()onCompleteaddNodeFilled()

var stitch:BitmapData = new BitmapData(16, 16);
var loaderStatus:String = "busy";           

var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
loader.load(new URLRequest("file:///E:/Projects/FlashDevelop/Terracotta/assets/Stripe.jpg"));

addNodeFilled(100, 100);



//function definitions===============================================


function onComplete(event:Event):void
{
  stitch = event.target.content.bitmapData;
  loaderStatus = "loaded";

} //onComplete

function addNodeFilled(posx:Number, posy:Number):void
{
  while(loaderStatus != "loaded")
  {
     trace("waiting for loader");
  }         

  var grid:Rectangle = new Rectangle(5, 5, 5, 5);
  var nodeDecal:Sprite = new Sprite();
  nodeDecal.graphics.beginBitmapFill(stitch, null, true, true);
  nodeDecal.graphics.drawRoundRectComplex(posx, posy, 80, 16, 0, 0, 4, 4);
  nodeDecal.scale9Grid = grid;
  addChild(nodeDecal);

} //addNodeFilled
4

1 に答える 1

1

AS3 は単一のスレッドで実行されます。そのループでイベント通知を受け取ることはありません。以下のコードを使用して、より良いパターンをモックアップしました。ニーズに合わせて少し調整する必要があります。特に、必要に応じて から、または からaddNodeFilled()呼び出すことができる独自のメソッドとの間で、描画コードを移動する必要があります。addNodeFilled()onComplete()

複数の描画操作がある場合は、drawPending 変数を、アセットが読み込まれた後に実行されるキューに置き換える必要があります。コードの複雑さが大幅に増加する可能性があるため、ここでは嘲笑していません。

var loader:Loader;
var loadPending:Boolean = false;
var isReady:Boolean = false;
var drawPending:Boolean = false;

function onComplete(event:Event):void
{
    if (drawPending)
    {
        // Perform drawing operating
    }
}

function triggerLoad():void
{
    loader = new Loader();
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
    loader.load("http://example.com");

    loadPending = true;
}

function addNodeFilled(x:Number, y:Number):void
{
    if (!isReady)
    {
        triggerLoad();
        drawPending = true;

        return;
    }

    if (loadPending)
    {
        drawPending = true;

        return;
    }

    // Use asset as needed
}
于 2013-07-04T10:51:59.950 に答える