转 第二章 ActionScript 3.0 动画基础(2)(as3.0)
来源:互联网 发布:php cdn缓存 编辑:程序博客网 时间:2024/05/22 01:03
帧循环
大。把代码写入关键帧,并在下一帧中写入像 gotoAndPlay 这样的语句,使播放头(playhead)
回到前一帧。这样两帧之间就形成了一个无限循环,每当播放头到了代码帧上时,就会执行
那些代码。例如,在舞台上有一个实例名为 ball 的影片剪辑。
第一帧的代码就像这样:
ball.x ++;
第二帧的代码如下:
gotoAndPlay(1);
三个帧,第一帧进行初始化,写入只执行一次的代码,不进行循环。第二帧才是主要的执行
代码,第三帧只写 gotoAndPlay(2); 这个方法在早期 Flash 版本中常被使用,虽然有点过
时,但是同样可以出色地完成任务。马上我们还要学到更灵活更强大的设置方法,但今后你
会发现其实原理上是一样的。
影片事件
的时代,只有帧循环和影片剪辑事件两种选择。影片事件指代码直接写在影片剪辑上,而不
是帧上。如何实现影片事件,首先选择舞台上的影片剪辑,然后打开动作面板并将代码写在
上面,这些代码只对该影片剪辑有效。所有代码必需写在事件块中,比如:
onClipEvent(eventName){
// code goes here
}
必需指定鼠标或键盘事件,如按下(press)和释放(release)。
事。事件分为两种:系统事件和用户事件。系统事件指发生在如计算机,Flash,或影片上
的事件,比如调取数据,调取信息,或播放帧等。用户事件是指用户所做的一些事,基本上
就是鼠标和键盘两种。 影片事件使用得最多的就是 load 和 enterFrame 这两个。 Load 事
件会在影片第一次出现在舞台上时才执行, 且只执行一次。 所以说非常适合在这里面写入初
始化代码。只要把代码写在大括号间即可:
onClipEvent(load){
// initialization code
}
我们可以把带有如下代码的影片剪辑放入时间轴上(注意:此处为 AS 1 写法):
onClipEvent (load) {
}
onClipEvent (enterFrame) {
}
法, 初始化(initialization),重复动作(repeating actions)和屏幕刷新(screen refresh)
都是非常重要的。
事件及事件处理
富客户端程序(RIA)奠定了基础。其中一个就是全新的事件结构,在编写非常复杂的行为时
比之前的版本好用很多。 Flash MX 之前的版本,只能把代码放在影片和按钮的
onClipEvent(eventName) 或 on(eventName) 这两种事件处理方法中。这就意味着,在设计
的时候就要把影片剪辑放到舞台上,并把代码写入影片剪辑中。MX 的事件结构并不完美,
但与之前版本来说已经有了长足的进步,并允许我们在任何时候访问任何事件,或是停止处
理任何事件,或是动态改变某个事件的行为,可以想象这有多么的强大和灵活。
两个名字很贴切,侦听器就是侦听事件的对象,处理函数是一个用于处理所要发生的事件的
函数。侦听与处理在 ActionScript 的发展过程中进行过很多次演变,在 AS 2 中就有很多
不同的实现方法。为了避免混乱,我很推崇 AS 3,因为它简化了这个过程,使事件处理变
得更方便更一致。
事件侦听器与处理函数
addEventListener 函数为某事件指定一个侦听器。输入要侦听的事件名称以及要执行处理
的函数名称。看一个例子:
addEventListener("enterFrame", onEnterFrame);
会使用以上这种写法就够用了。请注意事件名"enterFrame"为字符串型,戏称它为“魔力字
符串”(Magic String)。为什么这么叫?如果你误输入成了"entorFrame",尽管没有这个事
件名称,编译器也会编译执行它,会发现事件处理函数没有执行。但 AS 3 仍会对其进行处
理,除了使用“魔力字符串”以外,还可以使用事件类(Event Class)的属性。例如:
addEventListener(Event.ENTER_FRAME, onEnterFrame);
能输错就像 Event.ENTOR_FRAME ,但这种方法好在,如果输入错误了,程序会拒绝编译,
并提示你在事件类中不存在该属性。编译器会提示发生错误的行及确切的字符。所以,最好
使用这种方法,除非编译器会帮我们修正错误或编写代码。
除此之外,还有其它的事件类型如:MouseEvent.MOUSE_DOWN,KeyboardEvent.KEY_DOWN,
TimerEvent.TIMER 等。这些都由 "mouseDown" , "keyDown" , "timer" 这样的简单字符串
来表示,如果你记不住这些字符串,那么最好就去使用事件类的属性。
一个对象产生的事件,例如,有一个名为 mySpriteButton 的 Sprite 影片(Sprite):影片
或按钮,能完成按钮的动作。当用户点击它的时候就会产生 mouseDown(鼠标按下)事件。侦
听该 Sprite 影片的 mouseDown 事件, 就要调用该对象的 addEventListener 方法,如下:
mySpriteButton.addEventListener(MouseEvent.MOUSE_DOWN, onSpritePress);
处理函数命名,这点与以前的 ActionScript 不同。在 enterFrame 示例中,使用
onEnterFrame 做事件处理函数, 是因为我们习惯使用这个名称。 AS 3 中,
已不再是关键字,当然也可以为这个处理函数命名为 move,run,或是 doSomethingCool。
然而,我们已经习惯使用”on”表示事件开始,后面跟一些描述词如 onStartButtonClick,
onConfigXMLLoad 或 onRoketCrash。有些朋友喜欢在事件名后面加上 "Handler" 作为后
缀,如: enterFrameHandler,这只是个人偏好问题。
一个事件对象拥有一个包括了所有对象及自身的侦听器的列表。
不同类型的事件,如 mouseDown,mouseUp,mouseMove 等,那么它就拥有一个侦听器列表,
其中包括它所涉及的所有类型的事件。无论触发何种事件,都会检索一遍列表,然后使列表
中的每个对象都知道所发生的事件。
另一种对事件的描述是,
所产生的事件公布给所有成员,
用 removeEventListener 方法解除该成员;就是告诉对象从侦听器列表中删除该侦听器,
这样一来,他就不会再接收信息了。
其添加侦听器的代码:
package {
}
句是为它添加两个侦听器,侦听鼠标按下(MOUSE_DOWN)和鼠标弹起(MOUSE_UP)这两个事件。
它们是 MouseEvent 类的两个属性,而这个类必需要导入。最后定义两个处理函数
onMouseDown 和 onMouseUp。
括触发该事件时鼠标位置的信息如:鼠标点击在按钮上。对于键盘事件,就要包括按下键时
的信息如 Ctrl,Alt,Shift 等。把上述示例保存为 EventDemo.as 文件,并选择一种前面
讲过的编译方式。当运行 SWF 时,就会看到每次点击或图形时,都会输出 pressed 或
released。
动画事件
enterFrame 影片事件的示例。现在把这种方法运用到 AS 3 中,只需要增加一个
enterFrame 事件的侦听器即可:
addEventListener(Event.ENTER_FRAME, onEnterFrame);
一帧怎么能执行 enterFrame(进入帧) 事件呢?事实上,播放头并非真正地在进入下一帧,
它只停留在第一帧上,
一种方法:Flash 告诉播放头何时进行移动,可以把 enterFrame 看成一个定时器,只是有
些不精确。
下面我们看看第一个 AS 3 动画:
package {