Actionscript 3 AS3事件体系结构问题

Actionscript 3 AS3事件体系结构问题,actionscript-3,events,Actionscript 3,Events,调用使用外部位图文件作为填充的函数addNodeFilled()之前,我必须使用Loader类在flash player中加载位图文件,等待加载程序完成加载并触发事件。完成并执行相应的事件处理程序onComplete()。为了确保这一点,我有一个while循环来等待addNodeFilled()中加载的完成,但是当运行程序时,循环将无限继续,这意味着在闪存中,事件处理程序与主序列同步执行,直到addNodeFilled()结束才能执行。通常,addNodeFilled()中的代码放在onComp

调用使用外部位图文件作为填充的函数
addNodeFilled()
之前,我必须使用Loader类在flash player中加载位图文件,等待加载程序完成加载并触发
事件。完成
并执行相应的事件处理程序
onComplete()
。为了确保这一点,我有一个while循环来等待
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

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
}

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
}

您不能将addNodeFilled()调用移动到onComplete(event:event)吗?正如我已经说过的,将addNodeFilled()放置在事件处理程序函数中通常是这样做的,但我不能,因为addNodeFilled()是当需要使用不同的位置参数使用相同的用户提供的位图图像作为填充时,需要反复调用新节点。这种被迫将操作函数调用(此处为addNodeFilled)放在事件处理程序函数中的情况是有限的,因为它可以使用相同的参数只调用一次,通常操作函数所依赖的确保某件事情完成需要确保一次。您不能将addNodeFilled()调用移到onComplete吗(event:event)?正如我已经说过的,在事件处理程序函数中放置addNodeFilled()通常是这样做的,但我不能,因为addNodeFilled()当需要使用不同的位置参数使用相同的用户提供的位图图像作为填充时,需要一次又一次地调用新节点。这种情况是强制执行操作函数调用(此处为AddNodeDefilled)内部事件处理程序函数是有限的,因为它可以使用相同的参数只调用一次,通常需要确保操作函数所依赖的某项操作完成一次。+1:简单而有效。在这种情况下,资产/绘图操作可能应该在操作结束时调用的其他方法中完成addNodeFilled()或在onComplete()中。+1:简单而有效。在这种情况下,资产/绘图操作可能应该在addNodeFilled()或onComplete()末尾调用的附加方法中完成。