一,对比
引用cookbook的一个说法:
stage 是可视化对象列表层级的根节点。每个电影有一个stage 对象,它包含屏幕上显示出的所
有对象。实际上stage 是一个容器,可以通过引用stage属性来访问任何可视化对象。
引用帮助文档:
Stage 类代表主绘图区。 舞台表示显示 Flash ® 内容的整个区域。
无法以全局方式访问 Stage 对象。 而是需要利用 DisplayObject 实例的 stage
属性进行访问。
Stage 类具有多个始祖类 -- DisplayObjectContainer、InteractiveObject、DisplayObject 和 EventDispatcher,属性和方法便是从这些类继承而来的。 从这些继承的许多属性和方法不适用于 Stage 对象,或在调用 Stage 类时需要安全检查。 需要安全检查的属性和方法被记录为 Stage 类的一部分
做一个小实验:
问题:addEventListener(Event.ENTER_FRAME,Run) 和
stage.addEventListener(Event.ENTER_FRAME,Run2); 的区别小实验?
输出结果:
Event is:[object Example2]
Event is:[object Example2]
Event is:enterFrame
Event2 is:[object Stage]
Event2 is:[object Stage]
Event2 is:enterFrame
虽然暂时不能说明什么问题,但是数据输出,有stage 和没有stage监听的一个小区别,一个监听stage对象,也就是舞台监听,而一个是类监听。
再看官方的DisplayObject类的 stage 属性:
stage : Stage
[read-only] 显示对象的舞台。
|
DisplayObject |
DisplayObject 类的 stage属性。
显示对象的舞台。 Flash 应用程序只有一个 Stage 对象。 例如,您可以创建多个显示对象并加载到显示列表中,每个显示对象的 stage
属性是指相同的 Stage 对象(即使显示对象属于已加载的 SWF 文件)。
如果显示对象未添加到显示列表,则其 stage
属性会设置为 null
二,stage引发的问题
我曾经遇到这样一个问题,在main文档类和其他如tank类 在tank类写上了
stage.addEventListenr();这样的监听后,当我在main类创建一个tank类
会发现在tank类定义的键盘操作完全失效了。
tank类:
如:public function tank()
{
stage.addEventListenr();
}
//键盘监听
main类:
public function main():void
{
var my:tank= new tank();
addChild(my);
}
但是这样就失效了,我猜测stage 可以理解为舞台,由于表演的舞台只有一个,所以stage 在tank类失效了
为了解决这个问题,我曾经做了一这样小举动:
public function tank(stage:Object)
{
stage.addEventListenr();
}
这样在main类创建的类就能够实现了键盘监控了。
其实,使用当从外部加载一个swf的时候,stage也会遇到这样,至于具体好的办法我暂时还没有发现,如果有人知道可以解决更好的办法,可以留言给我