1

在调用addNodeFilled()使用外部位图文件作为填充的函数之前,我必须使用 Loader 类将位图文件加载到 Flash Player 中,并等待加载器完成加载并触发Event.COMPLETE并执行相应的事件处理程序onComplete()。为了确保这一点,我有一个 while 循环来等待加载完成,但是在运行程序时,程序 esp 循环无限地进行,这意味着在闪存中,事件处理程序与主序列同步执行,直到结束addNodeFilled()才能执行addNodeFilled(). 通常代码addNodeFilled()放在onComplete事件处理程序中,但我无法做到这一点,需要随时调用,addNodeFilled()但检查加载完成,我该怎么做?

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()和移入其自己的方法,该方法可以根据需要调用 fromaddNodeFilled()或 from 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 回答