闪客精灵自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
作者:
{commentrecontent}