在调用使用外部位图文件作为填充的函数addNodeFilled()之前,我必须使用Loader类将位图文件加载到flash player中,并等待加载程序完成加载并触发Event.COMPLETE,然后执行相应的事件处理程序onComplete()。为了确保这一点,我有一个while循环来等待addNodeFilled()中的加载完成,但当运行程序时,程序esp循环无限地进行,这意味着在flash中,事件处理程序与主序列同步执行,直到flash结束才能执行。通常,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发布于 2013-07-04 18:52:00
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
}https://stackoverflow.com/questions/17465391
复制相似问题