zoukankan      html  css  js  c++  java
  • [转]详解as3中的时间轴

    要想学Flash编程,时间轴必须得好好研究,as3中的时间轴从界面上看没什么变化,但实际是不是如此呢?

        首先创建一个Flash文档文件,单击时间轴的第1帧,打开动作面板,输入下列测试代码:

        trace(this)//[object Timeline0_64932e78da228d4e93dbb563793828e2]

        trace的过程实际上是调用了this的toString()方法,而toString()返回的是一个字符串,其中最常见的是"[object 类名]"这样的字符串.所以,从输出的信息中可以看出,this是 Timeline0_64932e78da228d4e93dbb563793828e2类的实例,而且,我们知道this代表当前的对象,当舞台是空的 时候,this代表的应是时间轴,所以暂时把imeline0_64932e78da228d4e93dbb563793828e2类称为 Timeline0类.

        同样的,可以测试下列代码:

        trace(root)//[object Timeline0_1f5aea26690d74f8aedd7abf338de7]

        与上面的代码输出的信息类似,只是Timeline0后面的字符不相同.但通过下面的代码可以说明,this与root的引用是一样的.

        trace(this==root)//true

        现在,对时间轴应该有了大概的了解:

        root是Timeline0类的一个唯一实例,请注意这里的唯一的含义,即当你创建一个flash文档文件时,不可能在出现2个或更多个主时间轴.同 样,虽然我们可以创建很多的影片剪辑实例,但每个影片剪辑实例也只能有1个时间轴,这些时间轴对应相应的Timeline1、Timeline2类.

        实际上,Timeline类是继承MovieClip类的一个动态类,所以,我们可以往类或实例中添加属性和方法.

        首先我们向Timeline0类添加一个属性和方法:

        var var1="variable"

        function func():String

        {

        return "function"

        }

        如何知道var1属性和func()方法已经添加到Timeline0类中,我们只需用Timeline0类的唯一实例root或this来测试一下.

        trace(root.var1,root.func())//variable function

        现在我们看到了,实例root已经具有了var1属性和func()方法,而且添加的属性和方法肯定是公有的,可以测试一下:

        root.var1="zjs"

        当然,我们不一定要通过实例来访问这些属性和方法,因为上面定义的属性和方法的语法实际上与在Timeline0类中定义是一样的,在Timeline0 类,任何类型的属性和方法都可以访问:

        trace(var1,func())//variable function

        因此,在时间轴上通过var和function定义的变量和函数,实际上是在Timeline0类中定义的属性和方法一样.有兴趣的朋友可以测试影片剪辑 实例与影片剪辑链接类的关系,在影片剪辑实例的时间轴中定义的变量可以被链接类访问,链接类定义的属性也可以在时间轴上访问到.

        然后,删除前面的代码,接下去我们向实例root中添加一些属性和方法:

        root.var1="variable"

        root.func=function():String

        {

        return "function"

        }

        这些实例特有的特征是它自己特有的,并没有添加到Timeline0类中,所以只能用"实例名."的形式访问它们:

        trace(this.var1,this.func())//variable function

        注意,此时的this代表的是root,this在类文件中表示实例,也就是说,this.var1和var1是不一样.前者代表访问实例属性var1, 如果这具实例属性是某个实例动态添加的,就不能通过var1的方法访问,但如果这个属性是所有实例都具有的,也就是类里面定义的属性,两种方式都可以访 问,因为,类里定义的属性,实例肯定有.而实例动态添加的,类里不一定能访问到.

        所以,到目前为上,在as3中定义变量的语法有2种:

        "var 变量名"和"this.变量名"

        使用var定义的变量都是属于特定类的,所以类时间轴(类)和实例(this)中都可以访问,而通过this定义的变量是属于特定实例的,访问这种变量时 一定要带上实例的引用,否则会出现变量没定义的错误.

        另外,定义变量时不使用this,也不使用var也是允许的,但它的作用域有点怪异.

        用this与不用this是不一样的(在as2中是一样的).

        测试1:

        var1=4

        trace(var1)//4

        测试2:

        var1=4

        trace(var1)//undefined

        变量不能重复定义,下面的代码报错

        var var1=4

        var var1=5

        但下面的代码不报错:

        var1=4

        var var1=5

        再测试:

        var1=4

        trace(var1)//4

        var var1=5

        trace(var1)//5

        这个问题等正式版出来再研究,呵

        as3中的根即顶级容器是stage,stage是Stage类的唯一实例,当你创建一个文档时,就创建了stage实例.上节提到的root就是 stage下的一个可视实例.

        由于stage和root都是容器,所以当在时间轴写代码时,可以有2个选择,即可在stage下添加对象,也可在root下添加对象.

        我们先在时间轴写代码:

        trace(stage.numChildren)//1

        trace(stage.getChildAt(0))//[object Timeline0_6d54148745b4f34c992852913c20679d]

        输出信息告诉我们,stage下有1个显示对象即root,而且root是在stage下,root是Timeline0类的实例.

        下面看看文档类.

        package

        {

        import flash.display.Sprite

        //文档类必须继承Sprite类或其子类(如MovieClip)

        public class DocumentClassExample extends Sprite

        {

        var var1=5

        function DocumentClassExample()

        {

        trace(stage.numChildren)//1

        trace(stage.getChildAt(0))//[object DocumentClassExample]

        }

        }

        }

        输出信息告诉我们,stage下还是只有1个显示对象,这具显示对象不再是root,而是DocumentClassExample类的实例,也就是 说,root被取代了.如果文档类是继承Sprite类,在时间轴就不能写代码了,因为Sprite类是没有时间轴的.如果要在时间轴写代表,要继承 MovieClip类.

        改一下代码:

        package

        {

        import flash.display.Sprite

        //文档类必须继承Sprite类或其子类(如MovieClip)

        public class DocumentClassExample extends MovieClip

        {

        var var1=5

        function DocumentClassExample()

        {

        trace(stage.numChildren)//1

        trace(stage.getChildAt(0))//[object DocumentClassExample]

        }

        }

        }

        实际上,如果你选择了MovieClip做为基类,问题就回到了上一节的Timeline0类,Timeline0类是继承MovieClip 类,DocumentClassExample类也是继承MovieClip类,它们都能自动创建一个实例,前者为root,后者为[object DocumentClassExample],虽然名不同,但在时间轴上,都可以用this来引用它们,测试一下:

        trace(this)//[object DocumentClassExample]

        也就是,Timeline0类也是文档类,只不过它是自动创建的,而DocumentClassExample类是我们自定义的.

        既然是这样,我们再来试试上1小节的测试代码:

        文档类改成这样:

        package

        {

        import flash.display.*

        public class DocumentClassExample extends MovieClip

        {

        var var1=5

        function DocumentClassExample()

        {

        }

        }

        }

        然后在时间轴上写上:

        var var1=8

        测试,提示命名冲突,也就是,var1你定义2次,嗯,就相当于在DocumentClassExample类里面定义了2次var1.因为上节我们提 过,一个变量在同一个命名空间里是汪能定义2次的.

        我们改一下时间轴的代码:

        var var2=8

        然后把文档类改成这样:

        package

        {

        import flash.display.*

        public class DocumentClassExample extends MovieClip

        {

        var var1=5

        function DocumentClassExample()

        {

        trace(var1,var2)//5 undefined

        }

        }

        }

        为什么是undefined,我想是初始化顺序的问题吧,也就是说,先执行构造函数,然后再执行var var2=8,既然是这样,我们往文档类中添加一个方法来访问var2,这样就能保证初始化顺序了.

        改一下文档类:

        package

        {

        import flash.display.*

        public class DocumentClassExample extends MovieClip

        {

        var var1=5

        function DocumentClassExample()

        {

        }

        public function _trace()

        {

        trace(var1,var2)

        }

        }

        }

        然后在主时间轴测试:

        var var2=8

        //直接在类中测试

        _trace()//5 8

        //通过实例测试

        this._trace()//5 8

        因为是构造函数先执行,然后再执行时间轴的代码,所以肯定可以用this._trace()的方式访问,为什么_trace()也可以呢,就像var定义 的变量是添加到文档类中一样,_trace()相当于是在文档类中进行测试.

        删除时间轴的代码,写成:

        trace(var1)//5

        呵,访问到了类里面定义变量,所以问题就回到了上一节的内容.

        在上一节中,我们除了使用var往Timeline0类添加变量外,还可以使用root.的形式添加实例特有的变量,下面来测试一下:

        this.var2=8

        测试时,提示无法创建var2n属性

        原因:MovieClip类虽然是动态类,而且DocumentClassExample类也继承了MovieClip类,但 DocumentClassExample类不是动态类,下面是在帮助中找到的一句话:

        动态类的子类也是动态的,但有一种情况例外.默认情况下,MovieClip 类的子类不是动态的,即使 MovieClip 类本身是动态的

        嗯,找到原因了,改一下DocumentClassExample类:

        package

        {

        import flash.display.*

        public dynamic class DocumentClassExample extends MovieClip

        {

        var var1=5

        function DocumentClassExample()

        {

        }

        public function _trace()

        {

        trace(var1,var2)

        }

        }

        }

        再测试,正常,往实例添加属性成功.

     出处:http://www.51as.com/as3/as3-271.html

  • 相关阅读:
    POJ 2923 Relocation (状态压缩,01背包)
    HDU 2126 Buy the souvenirs (01背包,输出方案数)
    hdu 2639 Bone Collector II (01背包,求第k优解)
    UVA 562 Dividing coins (01背包)
    POJ 3437 Tree Grafting
    Light OJ 1095 Arrange the Numbers(容斥)
    BZOJ 1560 火星藏宝图(DP)
    POJ 3675 Telescope
    POJ 2986 A Triangle and a Circle
    BZOJ 1040 骑士
  • 原文地址:https://www.cnblogs.com/sange/p/1731628.html
Copyright © 2011-2022 走看看