Flash AS 教程:动画事件
admin 2013-03-07 16:20:01
动画事件我们希望能够使用代码让物体动起来,并允许屏幕反复地刷新。前面看过一个使用 enterFrame 影片事件的示例。现在把这种方法运用到 AS 3 中,只需要增加一个 enterFrame 事件的侦听器即可:
addEventListener(Event.ENTER_FRAME, onEnterFrame);
别忘了导入 Event 类,并创建一个名为 onEnterFrame 的方法。人们常常迷惑,只有一帧怎么能执行 enterFrame(进入帧) 事件呢?事实上,播放头并非真正地在进入下一帧,它只停留在第一帧上,并不是把播放头移动到下一帧才形成了 enterFrame 事件,而是用另一种方法:Flash 告诉播放头何时进行移动,可以把 enterFrame 看成一个定时器,只是有些不精确。
下面我们看看第一个 AS 3 动画:
package {
import flash.display.Sprite;
import flash.events.Event;
public class FirstAnimation extends Sprite {
private var ball:Sprite;
public function FirstAnimation() {
init();
}
private function init():void {
ball = new Sprite();
addChild(ball);
ball.graphics.beginFill(0xff0000);
ball.graphics.drawCircle(0, 0, 40);
ball.graphics.endFill();
ball.x = 20;
ball.y = stage.stageHeight / 2;
ball.addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
private function onEnterFrame(event:Event):void {
ball.x ;
}
}
}
init 函数创建了一个名为 ball 的 Sprite 影片,并为其建立事件侦听。 onEnterFrame 函数负责 ball 的运动及屏幕刷新工作。这是学习本书内容的基础,也是使用 ActionScript 创建动画的基础,所以务必要掌握。
显示列表在 AS 3 之前,人们可以创建多个不同类型的可视化对象,包括影片剪辑,图形,按钮,文本框,位图,组件和基本形状。这些对象没有真正的层次结构,它们的创建、删除、操作方法也均不相同。比如,在 IDE 中,可以使用 attachMovie ,duplicateMovieClip 或 createEmptyMovieClip 的方法将影片剪辑放置于舞台上,文本框可以在开发环境中创建也可以用代码创建。而在使用位图(bitmap),视频(video)及组件(component)时,它们就像是来自于别的星球,最终被强硬地放在一起。
对于 AS 3 来说,这些对象都有了统一的归属。在舞台上所有可见的对象都继承自 DisplayObject 类。换句话讲,这些对象都是一个大家庭的成员,并以相同的形式工作,使用同样的方式进行创建,置入,删除,操作。无论创建 Sprite 影片,影片剪辑或文本框的方法都非常相近,我们需要使用 new 关键字来完成,创建任意类型的对象。为了证明这一点,请看下面三条示例:
var myTextfield:TextField = new TextField();
var myMovieClip:MovieClip = new MovieClip();
var mySprite:Sprite = new Sprite();
如果我们创建的是一个影片剪辑或 Sprite 影片的话,就可以直接里面进行绘制,如:
mySprite.graphics.beginFill(0xff0000);
mySprite.graphics.drawCircle(0, 0, 40);
mySprite.graphics.endFill();
但只有这些代码,还不能看到效果,这就引发了接下来要讨论的显示列表。“显示列表”是个新名词,可以理解为一颗由可视对象构成的树。舞台就是树根,默认为可见的,在舞台上,我们可以有很多影片剪辑或可视对象(文本框,图形等),把它们加入舞台后,也就成为可见的了。
这些影片中也许还嵌套着很多层的可视对象,这就是我们所谓的显示列表。 AS 2 与 AS 3 显示列表最大的不同在于,AS 2 中,当使用 attach 或 createEmptyMovieClip 方法创建影片剪辑时,必须指定它位于树的哪个位置。这样一来,影片剪辑要放置在列表的指定位置。当删除该影片时,同样也无法改变它在列表中的位置或在列表中移除它。
在 AS 3 中,创建了一些 Sprite 影片后,不会自动被加入显示列表。在上面的示例中我们发现,创建一个 Sprite 后,并不涉及父级影片(parent)或深度(depth)的问题,这样就可以在它没有加入视觉列表之前就对其进行操作了。说到舞台(Stage),可以把这些显示对象看作是幕后的演员,虽然看不到,但确实存在,并时刻准备着亮相的一刻,我们使用 addChild 方法把对象加入显示列表。将文档类作为树根,向里面加入孩子时,会自己被设置为可见的。
现在,在前面的例子中再加入创建 Sprite 对象以及 addChild 方法,如下:
var mySprite:Sprite = new Sprite();
mySprite.graphics.beginFill(0xff0000);
mySprite.graphics.drawCircle(0, 0, 40);
mySprite.graphics.endFill();
addChild(mySprite);
如果大家有兴趣试一下这段代码的话,请把它们写入前面所给的类框架的 init 函数中。请注意,绘制出的圆默认位置是0,0点,可以改变其 x 和 y 属性。还要注意,创建新影片时不再需要像 AS 2 那样去设置深度(depth)。虽然深度管理为自动执行,但我们还有指定深度或改变深度的方法,这部分等将来用到时再讲。
使用 removeChild 方法,从显示列表中删除一个对象,并以该对象的名字作为参数。第一,删除一个对象,不是去毁灭它,对象依然保持原样,只是暂时被移除,当再次被加入到显示列表中,对象仍保持原来的状态。换句话讲,如果显示对象里面绘制了图形,或是已加载了一些外部信息,那么将它重新加入显示列表后,就不必再去重绘或重载这些信息。第二,把该对象重新加入显示列表后,还可以为它指定处在显示列表中的位置,这就是我们所熟知的重定父级。
从一个影片剪辑中删除一个对象,再把它加载到另一个影片中剪辑中,并保持刚刚被删除时的状态,在以前是不可能完成的。事实上,有时并不需要去删除影片,因为,一个子对象只能有一个父级,把它加入到另一个父级中,就会自动从原来的父级中删除。请看下面示例:
package {
import flash.display.Sprite;
import flash.events.MouseEvent;
public class Reparenting extends Sprite {
private var parent1:Sprite;
private var parent2:Sprite;
private var ball:Sprite;
public function Reparenting() {
init();
}
private function init():void {
parent1 = new Sprite();
addChild(parent1);
parent1.graphics.lineStyle(1, 0);
parent1.graphics.drawRect(-50, -50, 100, 100);
parent1.x = 60;
parent1.y = 60;
parent2 = new Sprite();
addChild(parent2);
parent2.graphics.lineStyle(1, 0);
parent2.graphics.drawRect(-50, -50, 100, 100);
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);
}
}
}
该类中有三个 Sprite 对象:parent1, parent2, ball。 parent1, parent2 影片直接加入显示列表,并在影片中绘制了正方形。 Ball 影片被加入到 parent1,就相当于加入了显示列表并可见。当小球被点击时,它将被加入 parent2 影片中。请注意,没有改变 Ball 的 x,y 坐标的代码,之所以产生移动是因为 Ball 被加载到了不同位置的 Sprite 影片中。 Sprite 影片被删除后再被加入显示列表,Ball 仍会出现。
IT时代网(关注微信公众号ITtime2000,定时推送,互动有福利惊喜)所有原创文章版权所有,未经授权,转载必究。
创客100创投基金成立于2015年,直通硅谷,专注于TMT领域早期项目投资。LP均来自政府、互联网IT、传媒知名企业和个人。创客100创投基金对IT、通信、互联网、IP等有着自己独特眼光和丰富的资源。决策快、投资快是创客100基金最显著的特点。