ActionScript 2.0/MovieClip 简介
关键概念
ActionScript 2.0 围绕 MovieClip 展开。(它们在 AS3 中的重要性有所下降,但它们仍然是 Flash 应用程序的重要组成部分。)在本长篇章节中,我们将深入了解 MovieClip 的细节。
舞台 是所有动作发生的地方。Stage 类是一个包含与舞台相关的静态函数、静态属性和事件处理程序的类。
我们需要了解的第一个属性是 Stage.width 和 Stage.height。这些是只读属性,这意味着我们可以检索它们的值,但不能在运行时更改它们。它们是在 Flash IDE 本身中通过修改>文档窗口设置的。以下代码检索舞台中心点的坐标
代码 | 结果 |
---|---|
var centrePoint:Object = {x:Stage.width/2, y:Stage.height/2};
trace(centrePoint.x);
trace(centrePoint.y);
|
|
请注意我们如何使用属性 x 和 y 创建了一个对象。这将在本章以及第二节中派上用场。
有时,我们希望舞台“跳出”播放器或浏览器的框框,并占据整个屏幕。这称为全屏 模式。Stage 类有用于执行此操作的函数。请注意,全屏模式必须由用户输入启动,应用程序本身不允许这样做。同样值得注意的是,键盘输入在全屏模式下是被禁用的。此外,全屏模式只能在应用程序嵌入网页时使用。这是因为安全原因。HTML 代码也需要稍微修改以支持全屏模式。
为了切换全屏模式的开启和关闭,应该更改 Stage.displayState。
到目前为止,您应该对 Flash 时间轴非常熟悉,但它们到底是如何工作的呢?
当没有 ActionScript 的 Flash 应用程序运行时,一个播放头 会遍历主时间轴的帧,并逐个播放它们。当舞台上存在 MovieClip 符号时,它们各自也有一个播放头和时间轴。播放头移动的速度称为帧速率,以每秒帧数 (fps) 为单位。例如,一个帧速率为 10 fps 的应用程序每秒移动十次。
现在,当 ActionScript 介入时,情况就有点不同了。要记住的第一件事是,每帧中的代码在帧显示之前执行。例如,如果您将 gotoAndStop(3);
放在 MovieClip 的第一帧中,它将直接跳到第三帧,而不会显示第一帧。有一些函数可以移动播放头,我们已经在第一节中学习了它们,所以这里快速回顾一下
play()
和stop()
分别按顺序播放和停止播放帧。gotoAndPlay(frame)
和gotoAndStop(frame)
将分别跳转到指定的帧,然后播放和停止 Flash。prevFrame()
和nextFrame()
分别跳转到上一个和下一个帧。除非目标帧上存在stop()
语句,否则它们将播放。
您可能认为,一旦播放头停止,例如使用 gotoAndStop
或 stop
,帧速率就不再重要了。这与事实相去甚远。还记得事件吗?当事件触发时,屏幕不会立即改变。相反,它会等到下次“进入”帧时才会改变,这会以帧速率发生。此规则有两个例外,都涉及一个特殊函数;我们将在本章稍后讨论其中一个,而在下一章中讨论另一个。
MovieClip 类的 onEnterFrame
事件允许代码以帧速率不断执行。以下示例展示了如何使一个盒子落下
代码 | 结果 |
---|---|
//Assume that 'box' is a MovieClip instance on the stage.
onEnterFrame = function(){
box._y++;
trace("The box moved!");
}
|
|
现在假设我们希望应用程序的底部边缘充当地面。我们应该如何更改代码?
代码 | 结果 |
---|---|
//Assume that 'box' is a MovieClip instance on the stage.
onEnterFrame = function(){
if(box._y != Stage.height - box._height){
box._y++;
trace("The box moved!");
if(box._y > Stage.height - box._height){
box._y = Stage.height - box._height;
}
}
}
|
|
主时间轴的帧数有限。如果您想创建一个包含大量帧的 Flash 应用程序,例如侦探游戏,这可能不够。此外,在一个包含大量帧的应用程序中,如果您将所有帧都放在同一个时间轴上,可能会很烦人。幸运的是,这个问题有一个解决方案:场景。一个 Flash 应用程序可能有多个场景。单击 Flash IDE 中的窗口菜单以创建、删除和重命名场景。有四个函数可以更改场景
- prevScene(scene);
- nextScene(scene);
- gotoAndPlay(scene, frame);
- gotoAndStop(scene, frame);
您可能想知道为什么 gotoAndPlay 又出现了!嗯,这个 gotoAndPlay 与 MovieClip 方法 gotoAndPlay() 不同。首先,MovieClip.gotoAndPlay(frame) 和 MovieClip.gotoAndStop(frame) 不需要第一个 scene 参数。所有四个函数都是全局函数,无论您在哪里调用它们,它们始终(无一例外)会移动主时间轴。以下是一个包含三个场景(firstScene、secondScene、lastScene)的示例
代码 | 结果 |
---|---|
在第一个场景的第一帧上 stop();
trace("Welcome to firstScene!");
Mouse.addListener(this);
this.onMouseDown = function(){
if(Scene.currentScene != "lastScene"){
nextScene();
} else {
gotoAndPlay("firstScene", 1);
}
}
在第二个场景的第一帧上 trace("Welcome to secondScene!")
在第三个场景的第一帧上 trace("Welcome to lastScene!")
|
|
不幸的是,Scene.currentScene 在较旧的 Macromedia 版本的 Flash 中不可用。因此,您可能需要想出一些巧妙的方法来解决这个问题。例如,您可以在最后一幕的舞台外放置一个带有奇怪名称的影片剪辑。如果该影片剪辑已定义,那么鼠标点击应导致移动到第一幕。
我可以命名帧吗?
[edit | edit source]帧号通常很难记住。为最重要的帧命名通常是个好主意。帧名称为帧标签。要标记帧,请在属性面板中键入名称。然后,标签可以替换 gotoAndPlay 函数中的帧号(影片剪辑和全局)。
代码 | 结果 |
---|---|
//Assume that the fps is 20 and someImportantFrame is frame 5.
var timePassed:Number = 0;
onEnterFrame = function(){
if(_currentframe == 1){
timePassed++;
if(timePassed >= 20){
gotoAndPlay("someImportantFrame");
}
} else if(_currentframe == 5){
trace("Welcome to Frame 5!");
}
}
|
|
如何更改影片剪辑的外观和位置?
[edit | edit source]影片剪辑和坐标
[edit | edit source]正如我们已经讨论过的,_x 和 _y 是影片剪辑在其父级中(左上角)的 x 和 y 坐标。这很好,但我们如何在影片剪辑在主时间轴上方两级时找到它在舞台上的坐标?反过来呢?我们如何根据舞台上的另一个影片剪辑找到影片剪辑在舞台上的坐标?
局部坐标是另一个影片剪辑内部的点的坐标,而全局坐标(也称为舞台坐标)是舞台上点的坐标。MovieClip.localToGlobal() 和 MovieClip.globalToLocal() 函数在局部坐标和局部坐标之间进行转换。让我们一一尝试。将一个苹果影片剪辑实例放置在舞台上,然后在它里面放置一个蠕虫影片剪辑实例。我们的任务是找到蠕虫相对于舞台的坐标。将以下代码放在主时间轴的第一帧上
代码 | 结果 |
---|---|
var someCoordinates:Object = {x:apple.worm._x, y:apple.worm._y};
apple.worm.localToGlobal(someCoordinates);
trace("Global coordinates: (" + someCoordinates.x + ", " + someCoordintes.y));
|
|
_xscale 和 _yscale
[edit | edit source]_xscale 是影片剪辑在库中的原始宽度与缩放后当前宽度之比。_yscale 是影片剪辑在库中的原始高度与缩放后当前高度之比。它们与 _x 和 _y 属性无关!如果 _xscale 和 _yscale 相等,那么影片剪辑的纵横比将保持不变。
代码 | 结果 |
---|---|
apple._width = 10;
apple._height = 10;
if(apple._xscale == apple._yscale){
trace("Same aspect ratio!");
} else {
trace("Different aspect ratio!");
}
trace("Global coordinates: (" + someCoordinates.x + ", " + someCoordintes.y));
|
|
不透明度
[edit | edit source]_alpha 是影片剪辑不透明度的度量(从 0 到 100)。如果影片剪辑的 _alpha 值为 0,则它完全透明;如果它的 _alpha 为 100,则它完全不透明。尝试使用 _alpha!
代码 | 结果 |
---|---|
apple._alpha = 0;
|
|
什么是焦点?
[edit | edit source]您是否曾经在屏幕上同时打开两个窗口?当您例如输入时,文本只会影响其中一个窗口。受影响的窗口具有焦点,而另一个窗口则没有。
影片剪辑也有焦点。
影片剪辑如何响应鼠标操作?
[edit | edit source]与鼠标相关的事件有哪些?
[edit | edit source]用户如何拖动影片剪辑?
[edit | edit source]如何检测碰撞?
[edit | edit source]要检测影片剪辑之间的碰撞,其实很简单,
有两种方法
if(MovieClip1.hitTest(MovieClip2)) 将检测 MovieClip1 和 2 的碰撞框是否接触。
和
if(MovieClip1.hitText(x,y,flag)) 将检测 MovieClip1 的碰撞框是否接触 x 和 y 位置。
如何动态创建影片剪辑?
[edit | edit source]什么是深度?
[edit | edit source]如何使用库中的影片剪辑?
[edit | edit source]如何创建空影片剪辑?
[edit | edit source]如何复制影片剪辑?
[edit | edit source]如何销毁影片剪辑?
[edit | edit source]- _quality
- getSWFVersion