Flash CS3 文档 |
|||
| ActionScript 3.0 编程 > 处理影片剪辑 > 控制影片剪辑回放 | |||
Flash 利用时间轴来形象地表示动画或状态改变。任何使用时间轴的可视元素都必须为 MovieClip 对象或从 MovieClip 类扩展而来。尽管 ActionScript 可控制任何影片剪辑的停止、播放或转至时间轴上的另一点,但不能用于动态创建时间轴或在特定帧添加内容,这项工作仅能使用 Flash 创作工具来完成。
MovieClip 在播放时将以 SWF 文件的帧速率决定的速度沿着其时间轴推进。或者,您也可以通过在 ActionScript 中设置 Stage.frameRate 属性来覆盖此设置。
play() 和 stop() 方法允许对时间轴上的影片剪辑进行基本控制。例如,假设舞台上有一个影片剪辑元件,其中包含一个自行车横穿屏幕的动画,其实例名称设置为 bicycle。如果将以下代码附加到主时间轴上的关键帧,
bicycle.stop();
自行车将不会移动(将不播放其动画)。自行车的移动可以通过一些其它的用户交互来开始。例如,如果您有一个名为 startButton 的按扭,则主时间轴上某一关键帧上的以下代码会使单击该按扭时播放该动画:
// 单击该按扭时调用此函数。它会使
// 自行车动画进行播放。
function playAnimation(event:MouseEvent):void
{
bicycle.play();
}
// 将该函数注册为按钮的侦听器。
startButton.addEventListener(MouseEvent.CLICK, playAnimation);
在影片剪辑中,play() 和 stop() 方法并非是控制回放的唯一方法。也可以使用 nextFrame() 和 prevFrame() 方法手动向前或向后沿时间轴移动播放头。调用这两种方法中的任一方法均会停止回放并分别使播放头向前或向后移动一帧。
使用 play() 方法类似于每次触发影片剪辑对象的 enterFrame 事件时调用 nextFrame()。使用此方法,您可以为 enterFrame 事件创建一个事件侦听器并在侦听器函数中让 bicycle 回到前一帧,从而使 bicycle 影片剪辑向后播放,如下所示:
// 触发 enterFrame 事件时调用此函数,这意味着
// 每帧调用一次该函数。
function everyFrame(event:Event):void
{
if (bicycle.currentFrame == 1)
{
bicycle.gotoAndStop(bicycle.totalFrames);
}
else
{
bicycle.prevFrame();
}
}
bicycle.addEventListener(Event.ENTER_FRAME, everyFrame);
在正常回放过程中,如果影片剪辑包含多个帧,播放时将会无限循环播放,也就是说在经过最后一帧后将返回到第 1 帧。使用 prevFrame() 或 nextFrame() 时,不会自动发生此行为(在播放头位于第 1 帧时调用 prevFrame() 不会将播放头移动到最后一帧)。以上示例中的 if 条件将检查播放头是否已返回至第一帧,并将播放头设置为处于最后一帧前面,从而有效地使影片剪辑向后持续循环播放。
向新帧发送影片剪辑非常简单。调用 gotoAndPlay() 或 gotoAndStop() 将使影片剪辑跳到指定为参数的帧编号。或者,您可以传递一个与帧标签名称匹配的字符串。可以为时间轴上的任何帧分配一个标签。为此,选择时间轴上的某一帧,然后在属性检查器的“帧标签”字段中输入一个名称。
当创建复杂的影片剪辑时,使用帧标签比使用帧编号具有明显优势。当动画中的帧、图层和补间的数量变得很大时,应考虑给重要的帧加上具有解释性说明的标签来表示影片剪辑中的行为转换(例如,“离开”、“行走”或“跑”)。这可提高代码的可读性,同时使代码更加灵活,因为转到指定帧的 ActionScript 调用是指向单一参考(“标签”而不是特定帧编号)的指针。如果您以后决定将动画的特定片段移动到不同的帧,则无需更改 ActionScript 代码,只要将这些帧的相同标签保持在新位置即可。
为便于在代码中表示帧标签,ActionScript 3.0 包括了 FrameLabel 类。此类的每个实例均代表一个帧标签,并具有一个 name 属性(表示在属性检查器中指定的帧标签的名称)和一个 frame 属性(表示该标签在时间轴上所处帧的帧编号)。
为了访问与影片剪辑实例相关联的 FrameLabel 实例,MovieClip 类包括了两个可直接返回 FrameLabel 对象的属性。currentLabels 属性返回一个包含影片剪辑整个时间轴上所有 FrameLabel 对象的数组。currentLabel 属性返回一个表示在时间轴上最近遇到的帧标签的 FrameLabel 对象。
假设在创建一个名为“机器人”的影片剪辑并已经为其动画的各个状态加上了标签。可以设置一个用于检查 currentLabel 属性的条件以访问机器人的当前状态,如以下代码所示:
if (robot.currentLabel.name == "walking"
{
// 完成一些操作
}
Flash CS3
当前页: http://livedocs.adobe.com/flash/9.0_cn/main/00000212.html