Flash AS 教程:动画事件_Flash教程-查字典教程网
Flash AS 教程:动画事件
Flash AS 教程:动画事件
发布时间:2016-12-21 来源:查字典编辑
摘要:动画事件我们希望能够使用代码让物体动起来,并允许屏幕反复地刷新。前面看过一个使用enterFrame影片事件的示例。现在把这种方法运用到AS...

动画事件

我们希望能够使用代码让物体动起来,并允许屏幕反复地刷新。前面看过一个使用 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 仍会出现。

相关阅读
推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
  • 大家都在看
  • 小编推荐
  • 猜你喜欢
  • 最新Flash教程学习
    热门Flash教程学习
    网页设计子分类