闪客精灵 反编输出类文件的体验

      Flash学习笔记 2009-2-13 12:10

  闪客精灵自4.0版以后,支持AS3类文件的反编译导出功能,使用起来非常方便,在这里根据http://www.gotoandlearn.com 里的视频教程,给大家提供一个示例,用来了解时间轴上写代码,与类文件中写代码之间的关系。

  先用flash 9/10 创建一个fla文件,在第一帧中写入类似下面的代码:

var myText:TextField = new TextField();
myText.text = "hello, Package!"
addChild(myText);

保存并运行,得到一个swf 文件,

  运行闪客精灵4,打开刚才得到的这个swf 文件,在动作资源里可以看到如下的类代码:

package swf_fla
{
    import flash.display.*;  //自动导入相关的类包
    import flash.text.*;

    dynamic public class MainTimeline extends MovieClip
    {
        public var myText:TextField;  //自动将全局变量定义为公共属性

        public function MainTimeline()
        {
            addFrameScript(0, this.frame1); //向第一帧(索引号为零)添加函数。
            return;
        }// end function

         function frame1()  //第一帧中的代码被放置在这个函数体内。
        {
            this.myText = new TextField();
            this.myText.text = "hello, Package!";
            addChild(this.myText);
            return;
        }// end function

    }
}
该类结构自动的导入了相关的 flash 内置类,并且以 向指定帧添加帧代码的形式,将第一帧的代码添加进来。

在 fla 文件的第10帧添加一个空白键帧,里面加入下面的代码:

//var myText:TextField = new TextField();     //此行不可用,系统会报错,提示变量名冲突。
myText.text = "hello, see you again!";

反编译之后得到下面的代码:

package swf_fla
{
    import flash.display.*;
    import flash.text.*;

    dynamic public class MainTimeline extends MovieClip
    {
        public var myText:TextField;

        public function MainTimeline()
        {
            addFrameScript(0, this.frame1, 9, this.frame10);
            return;
        }// end function

        function frame10()
        {
            this.myText.text = "hello, see you again!";
            return;
        }// end function

        function frame1()
        {
            this.myText = new TextField();
            this.myText.text = "hello, Package!";
            addChild(this.myText);
            return;
        }// end function

    }
}

新建一个 fla 文件,在第20帧上加一个空白帧(确保我们有足够的帧可以用)。把前面得到的这个类文件当做是文档类,新建AS3文件,将类代码拷入,删除包名称 swf_fla ,与新建的 fla 文件保存在同一个目录下,为 fla 文件指定文档类的名称为 MainTimeline ,完成之后,运行可以看到,文本框正确的显示了出来。

运行之后可以发现:

1、 addFrameScript 函数只能实现向指定帧添加函数的功能,并不会直接的生成指定的帧,如果 fla 文件中只有一帧,那么第10帧的代码就不会生效。

2、文字有重影效果,这表明,当一轮播放结束后,下一轮重新播放时,旧的文本框并没有被自动覆盖掉,而是又新建了一个文本框,变量重名冲突的问题在这种“重播”情况下是不会发生的,我们通过在 frame1()函数中直接 trace( numChildren); 就可以发现,每过一轮这个值就会增加1,解决的办法就是,在重播前,将所有的子对象都移除,代码如下:

public function frame1()
  {
   while( numChildren >0){
    removeChildAt(0);
   }
   trace( numChildren);
   this.myText = new TextField();
   this.myText.text = "hello, Package!";
   addChild(this.myText);
   return;
  }// end function

因为重播状态下,舞台上应该保持一个全新状态,所以移除全部已有对象,可以保证一个干净的初始环境。再次执行,可以发现文本没有重叠现象了。

回复Comments() 点击Count()

回复Comments

{commentauthor}
{commentauthor}
{commenttime}
{commentnum}
{commentcontent}
作者:
{commentrecontent}