前面已经讲过生成 Sprite 或 MovieClip 类的子类,对某个类进行子类化是非常有用的。首先,大家可能对 AS 3 取消 attachMovieClip 功能感到十分惊呀,如果这样的话,我们怎么才能在 Flash CS3 IDE 库中取出影片剪辑元件放入舞台呢?答案是,使用一个继承自 MovieClip 或 Sprite 的类。为了能够好地解释这个问题,简单地介绍一下 IDE:
-
创建一个新的 FLA 文件,并在舞台上绘制一些图形。
选中图形按下 F8 键转换为元件。
在转换为元件窗口中输入一个名称,并设置为影片剪辑类型。
选择为 ActionScript 导出。
随意输入一个类名,不必担心没有这个类,然后点击确定。这个地方很有趣,Flash 找不到这个类,它就会自动生成一个类,并对其进行编译。并不是说 Flash 会创建一个 ActionScript 类文件,但它会在 SWF 中,生成一串字节代码表示一个继承自 Sprite 或 MovieClip 的类。除了继承了基类,它什么都不会做,但它已经与库中的元件连接上了。比如,你的类名为 Ball。在文档类或时间轴上,可以这么写:
var ball:Ball = new Ball();
addChild(ball);
这样就在舞台上创建了一个库中的元件,就像 AS 2 的 attachMovie 方法一样。我们要是能给出自定义的真正的类名及路径的话,那么就可以让元件附加很多功能。现在,我们跳出 Flash IDE 回到类的世界,看下一个示例。下面再看一个重定父级的示例,这里有一些重复的部分可以写入另一个类中。看一下示例,假设已经创建了一个名为 parent1 的 Sprite 实例,要里面绘制正方形:
parent1.graphics.lineStyle(1, 0);
parent1.graphics.drawRect(-50, -50, 100, 100);
下面再创建一个名为 parent2 的 Sprite 实例,同样也是绘制一个正方形。当然这个例子毫无意义,但它可以告诉我们 Sprite 的子类是多么的有用。首先,我们建立一个名为 ParentBox 的类,并继承自 Sprite,这样一来,就拥有了绘制正方形的代码:
package {
import flash.display.Sprite;
public class ParentBox extends Sprite {
public function ParentBox() {
init();
}
private function init():void {
graphics.lineStyle(1, 0);
graphics.drawRect(-50, -50, 100, 100);
}
}
}
然后,使用这个类创建两个 ParentBox,这样做比创建两个 Sprite 对象要好得多。
package {
import flash.display.Sprite;
import flash.events.MouseEvent;
public class Reparenting2 extends Sprite {
private var parent1:ParentBox;
private var parent2:ParentBox;
private var ball:Sprite;
public function Reparenting2() {
init();
}
private function init():void {
parent1 = new ParentBox();
addChild(parent1);
parent1.x = 60;
parent1.y = 60;
parent2 = new ParentBox();
addChild(parent2);
parent2.x = 170;
parent2.y = 60;
ball = new Sprite();
parent1.addChild(ball);
ball.graphics.beginFill(0xff0000);
ball.graphics.drawCircle(0, 0, 40);
ball.graphics.endFill();
ball.addEventListener(MouseEvent.CLICK, onBallClick);
}
public function onBallClick(event:MouseEvent):void {
parent2.addChild(ball);
}
}
}
作为 ParentBox 的实例,它们仍是 Sprite ,因此还可以再增加子影片, init 方法直接进行绘图。虽然这个示例价值不大,但可以让你学会这种思想,往后,会在书中看到更多更复杂的示例。你也许想自己动手创建一个球(Ball)类,用于绘制小球,虽然这么做不会减少代码里,但是当你的类变得十分复杂时,把功能代码分离到不同的类中,这绝对是个好办法,它比将所有类写在一起要好得多,同时还促进了代码的重用性。那么现在就去创建这个 Ball 类吧,在日后的学习中还要用到呢。