阳光VIP

少壮不努力,老大徒伤悲。平日弗用功,自到临期悔。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

每天学一点flash(52) stage的认识

Posted on 2012-02-17 20:16  阳光VIP  阅读(234)  评论(0编辑  收藏  举报

一,对比

引用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也会遇到这样,至于具体好的办法我暂时还没有发现,如果有人知道可以解决更好的办法,可以留言给我