Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flash addChild()-DisplayObject不是';我看不见_Flash_Actionscript 3_Flex4 - Fatal编程技术网

Flash addChild()-DisplayObject不是';我看不见

Flash addChild()-DisplayObject不是';我看不见,flash,actionscript-3,flex4,Flash,Actionscript 3,Flex4,当我将DisplayObject添加到函数中的DisplayObjectContainer(例如,将精灵添加到精灵)时,DisplayObject似乎不是立即添加的,而是在完成函数后添加的 请参见此示例: package { import flash.display.Sprite; import flash.events.MouseEvent; public class AddChildTest extends Sprite { private var

当我将DisplayObject添加到函数中的DisplayObjectContainer(例如,将精灵添加到精灵)时,DisplayObject似乎不是立即添加的,而是在完成函数后添加的

请参见此示例:

package {
    import flash.display.Sprite;
    import flash.events.MouseEvent;

    public class AddChildTest extends Sprite {

        private var _sprite:Sprite;

        public function AddChildTest():void{            
            var button:Sprite = new Sprite();
            button.graphics.beginFill(0x00ff00);
            button.graphics.drawRect(0, 0, 50, 50);
            button.graphics.endFill();
            button.buttonMode = true;
            button.addEventListener(MouseEvent.CLICK, onClick);
            addChild(button);               
        }

        private function onClick(event:MouseEvent):void {
            _sprite = new Sprite();
            _sprite.graphics.beginFill(0xff0000);
            _sprite.graphics.drawRect(0, 0, 50, 50);
            _sprite.graphics.endFill();
            _sprite.x = 50;
            _sprite.y = 50;                     

            //this red sprite is not visible immediateley!
            addChild(_sprite);      

            //put something time-consuming here
            for (var i:int = 0; i < 2000; i++){
                trace(i);
            }
        }
    }
}
包{
导入flash.display.Sprite;
导入flash.events.MouseEvent;
公共类AddChildTest扩展了Sprite{
私有变量精灵:精灵;
公共函数AddChildTest():void{
var按钮:Sprite=newsprite();
按钮.graphics.beginll(0x00ff00);
按钮.graphics.drawRect(0,0,50,50);
button.graphics.endFill();
button.buttonMode=true;
按钮.addEventListener(MouseEvent.CLICK,onClick);
addChild(按钮);
}
私有函数onClick(事件:MouseEvent):void{
_精灵=新精灵();
_sprite.graphics.beginll(0xff0000);
_sprite.graphics.drawRect(0,0,50,50);
_sprite.graphics.endFill();
_雪碧x=50;
_雪碧y=50;
//这个红色的精灵是看不见的!
addChild(_sprite);
//把一些耗时的东西放在这里
对于(变量i:int=0;i<2000;i++){
微量元素(i);
}
}
}
}
所以我们有一个简单的绿色按钮,当它被点击时,有一个红色的精灵被构建并添加到舞台上。 但实际上,在onClick()函数完全执行之前,红色精灵是不可见的

为什么会这样?我该怎么做才能让红色精灵立即可见

是否有一些(对于开发人员来说是不可见的)全局paint()或update()函数,在某个堆栈完全执行或其他操作之前不会执行

是否有一些(对于不可见的开发人员)全局绘制()或更新() 函数,直到某个堆栈完全执行或 什么

是的,有些东西。这里有一个随机链接(通过谷歌):


直到执行所有帧代码后,才会绘制或重新绘制屏幕。

前面的答案与帧构造有关,同时请注意,有几个有用的事件可帮助您处理添加/删除对象时显示列表的延迟:

  private function onClick(event:MouseEvent):void {
        _sprite = new Sprite();
        _sprite.graphics.beginFill(0xff0000);
        _sprite.graphics.drawRect(0, 0, 50, 50);
        _sprite.graphics.endFill();
        _sprite.x = 50;
        _sprite.y = 50;                     

        //this red sprite is not visible immediateley!
        _sprite.addEventListener(Event.ADDED_TO_STAGE, onReady);
        addChild(_sprite);      

    }

  private function onReady(e: Event): void {

        _sprite.removeEventListener(Event.ADDED_TO_STAGE, onReady);

        //put something time-consuming here
        for (var i:int = 0; i < 2000; i++){
            trace(i);
        }
    }
private函数onClick(事件:MouseEvent):void{
_精灵=新精灵();
_sprite.graphics.beginll(0xff0000);
_sprite.graphics.drawRect(0,0,50,50);
_sprite.graphics.endFill();
_雪碧x=50;
_雪碧y=50;
//这个红色的精灵是看不见的!
_sprite.addEventListener(Event.ADDED_至_阶段,onReady);
addChild(_sprite);
}
私有函数onReady(e:事件):void{
_sprite.removeEventListener(Event.ADDED_到_阶段,onReady);
//把一些耗时的东西放在这里
对于(变量i:int=0;i<2000;i++){
微量元素(i);
}
}

这里,在启动耗时的例程之前,会监听Event.ADDED_TO_STAGE,因此屏幕不会留空

这与Flash的单线程特性有关,而不是其他任何特性。它的工作方式是执行响应交互事件的任何代码(您的代码)。然后,响应prerender事件的任何代码(没有使用那么多),完成所有操作后,最终呈现

这是一连串的事件

如果代码需要很长时间才能运行,这将延迟后续渲染

因此,如果你想显示一个进度指示器或类似的东西,你至少需要在“轨迹”上等待下一次处理,最好在多个帧上分割,以保持你的UI美观和响应。最简单的方法是使用定时器稍微延迟计算

 private function onClick(event:MouseEvent):void {
    // add sprite here

    var t:Timer = new Timer(50, 1);

    // i'm using an anonymous function here, however, a proper event handler 
    // function is probably cleaner

    t.addEventListener(TimerEvent.COMPLETE, function(e:Event):void {
        //put something time-consuming here
        for (var i:int = 0; i < 2000; i++){
            trace(i);
        }
    }
    t.start();
}
private函数onClick(事件:MouseEvent):void{
//在这里加雪碧
变量t:定时器=新定时器(50,1);
//然而,我在这里使用的是一个匿名函数,一个合适的事件处理程序
//功能可能更干净
t、 addEventListener(TimerEvent.COMPLETE,函数(e:事件):无效{
//把一些耗时的东西放在这里
对于(变量i:int=0;i<2000;i++){
微量元素(i);
}
}
t、 start();
}

原因如下:

flash player以帧方式呈现显示列表。它发送
事件。输入_frame
,准备呈现(在MovieClips中移动播放头等),然后
事件。呈现
(假设您使舞台无效),然后渲染,然后分派
事件。离开后退出\u帧

因此,在渲染下一帧之前,对显示列表的任何后续更改将不可见-除非强制执行

然而,在退出帧和下一个进入帧之间,来自I/O和定时器的所有事件都被调度。鼠标也在输入设备中,因此此时处理
MouseEvent
s

有些事件(并非全部,但最重要的事件包括
MouseEvent
TimerEvent
KeyboardEvent
)具有
updateAfterEvent
方法,该方法将强制flash播放器在事件处理后立即渲染


请注意,此选项应小心处理。如果您的帧速率下降到目前为止,您会看到正在处理的鼠标事件和正在渲染的更改之间的延迟,强制在播放器上进行更多渲染可能不是最好的主意。

感谢您的快速回复,但是……好吧,我来自Java,对frame-t不太了解我正在开发一个纯AS3应用程序。看来我需要深入了解一下闪光灯的原理…我