Flash AS 教程:动画事件

  • 来源: 学赛网 作者: 若水   2008-04-24/12:33
  • 动画事件

    我们希望能够使用代码让物体动起来,并允许屏幕反复地刷新。前面看过一个使用 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 方法创建影片剪辑时,必须指定它位于树的哪个位置。这样一来,影片剪辑要放置在列表的指定位置。当删除该影片时,同样也无法改变它在列表中的位置或在列表中移除它。#p#分页标题#e#

    在 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仍会出现。


    评论 {{userinfo.comments}}

    {{money}}

    {{question.question}}

    A {{question.A}}
    B {{question.B}}
    C {{question.C}}
    D {{question.D}}
    提交

    驱动号 更多