Flash AS 教程:帧循环
程序员文章站
2023-03-30 18:09:03
帧循环
帧循环的理念,存在于 Flash 最早的版本中,那时 ActionScript 还不像今天那么强大。把代码写入关键帧,并在下一帧中写入像 gotoAndPlay 这样的语句,使播放头(playhead)回... 08-10-06...
帧循环
帧循环的理念,存在于 flash 最早的版本中,那时 actionscript 还不像今天那么强大。把代码写入关键帧,并在下一帧中写入像 gotoandplay 这样的语句,使播放头(playhead)回到前一帧。这样两帧之间就形成了一个无限循环,每当播放头到了代码帧上时,就会执行那些代码。例如,在舞台上有一个实例名为 ball 的影片剪辑。
第一帧的代码就像这样:
ball.x ;
第二帧的代码如下:
gotoandplay(1);
实际上第二帧不需要做任何事,只是让时间轴自动回到第一帧而以。另一个版本是建立三个帧,第一帧进行初始化,写入只执行一次的代码,不进行循环。第二帧才是主要的执行代码,第三帧只写 gotoandplay(2); 这个方法在早期 flash 版本中常被使用,虽然有点过时,但是同样可以出色地完成任务。马上我们还要学到更灵活更强大的设置方法,但今后你会发现其实原理上是一样的。
影片事件
影片事件在 as 3 中彻底的消失了,这真是件好事。但还要捎带提一下,回顾 flash 5 的时代,只有帧循环和影片剪辑事件两种选择。影片事件指代码直接写在影片剪辑上,而不是帧上。如何实现影片事件,首先选择舞台上的影片剪辑,然后打开动作面板并将代码写在上面,这些代码只对该影片剪辑有效。所有代码必需写在事件块中,比如:
onclipevent(eventname){
// code goes here
}
对于 onclipevent(eventname),作用于 eventname(某种事件)。对于"on"类型事件则必需指定鼠标或键盘事件,如按下(press)和释放(release)。
事件名称(eventname)是指许多flash 影片事件之一,所谓事件就是在影片中发生的事。事件分为两种:系统事件和用户事件。系统事件指发生在如计算机,flash,或影片上的事件,比如调取数据,调取信息,或播放帧等。用户事件是指用户所做的一些事,基本上就是鼠标和键盘两种。影片事件使用得最多的就是 load 和 enterframe 这两个。 load 事件会在影片第一次出现在舞台上时才执行,且只执行一次。所以说非常适合在这里面写入初始化代码。只要把代码写在大括号间即可:
onclipevent(load){
// initialization code
}
我们可以把带有如下代码的影片剪辑放入时间轴上(注意:此处为 as 1 写法):
onclipevent (load) {
this._x = 100;
this._y = 100;
}
onclipevent (enterframe) {
this._x = 5;
}
本书示例中的代码不使用这种写法(因为它已经不是一种语言了),但不论使用何种方法,初始化(initialization),重复动作(repeating actions)和屏幕刷新(screen refresh)都是非常重要的。
事件及事件处理
flash mx 的 actionscrpt 发生了重要的改变,这些转变与革新为 flash 成为真正的富客户端程序(ria)奠定了基础。其中一个就是全新的事件结构,在编写非常复杂的行为时比之前的版本好用很多。 flash mx 之前的版本,只能把代码放在影片和按钮的 onclipevent(eventname) 或 on(eventname) 这两种事件处理方法中。这就意味着,在设计的时候就要把影片剪辑放到舞台上,并把代码写入影片剪辑中。mx 的事件结构并不完美,但与之前版本来说已经有了长足的进步,并允许我们在任何时候访问任何事件,或是停止处理任何事件,或是动态改变某个事件的行为,可以想象这有多么的强大和灵活。
要想了解事件,就要明白下面几条概念:侦听器(lintener)与处理函数(handler),这两个名字很贴切,侦听器就是侦听事件的对象,处理函数是一个用于处理所要发生的事件的函数。侦听与处理在 actionscript 的发展过程中进行过很多次演变,在 as 2 中就有很多不同的实现方法。为了避免混乱,我很推崇 as 3,因为它简化了这个过程,使事件处理变得更方便更一致。
事件侦听器与处理函数
前面说过,侦听器是一个用于侦听事件的对象。我们可以设计一个类,通过调用addeventlistener 函数为某事件指定一个侦听器。输入要侦听的事件名称以及要执行处理的函数名称。看一个例子:
addeventlistener("enterframe", onenterframe);
在加入事件侦听器时,可使用可选参数,本书中不会用到;对于大多数的应用程序来说,会使用以上这种写法就够用了。请注意事件名"enterframe"为字符串型,戏称它为“魔力字符串”(magic string)。为什么这么叫?如果你误输入成了"entorframe",尽管没有这个事件名称,编译器也会编译执行它,会发现事件处理函数没有执行。但 as 3 仍会对其进行处理,除了使用“魔力字符串”以外,还可以使用事件类(event class)的属性。例如:
addeventlistener(event.enter_frame, onenterframe);
实际上 event.enter_frame 的值就是”enterframe”这个字符串。那么这个属性也可能输错就像 event.entor_frame ,但这种方法好在,如果输入错误了,程序会拒绝编译,并提示你在事件类中不存在该属性。编译器会提示发生错误的行及确切的字符。所以,最好使用这种方法,除非编译器会帮我们修正错误或编写代码。
除此之外,还有其它的事件类型如:mouseevent.mouse_down,keyboardevent.key_down,timerevent.timer 等。这些都由 "mousedown" , "keydown" , "timer" 这样的简单字符串来表示,如果你记不住这些字符串,那么最好就去使用事件类的属性。
另一个重点是,使用 addeventlistener 函数直接调用类中的函数。有时,需要侦听另一个对象产生的事件,例如,有一个名为 myspritebutton 的 sprite 影片(sprite):影片或按钮,能完成按钮的动作。当用户点击它的时候就会产生 mousedown(鼠标按下)事件。侦听该 sprite 影片的 mousedown 事件,就要调用该对象的 addeventlistener 方法,如下:
myspritebutton.addeventlistener(mouseevent.mouse_down, onspritepress);
最后一点,必需要有事件处理函数如 onenterframe,在 as 3 中,可以任意地为事件处理函数命名,这点与以前的 actionscript 不同。在 enterframe 示例中,使用 onenterframe 做事件处理函数,是因为我们习惯使用这个名称。在 as 3 中,onenterframe 已不再是关键字,当然也可以为这个处理函数命名为 move,run,或是 dosomethingcool。然而,我们已经习惯使用”on”表示事件开始,后面跟一些描述词如 onstartbuttonclick,onconfigxmlload 或 onroketcrash。有些朋友喜欢在事件名后面加上 "handler" 作为后缀,如: enterframehandler,这只是个人偏好问题。
侦听器用于侦听事件,但对于一个侦听器来说,也许会同时侦听很多事件。在系统内部,一个事件对象拥有一个包括了所有对象及自身的侦听器的列表。如果一个对象能够产生多种不同类型的事件,如 mousedown,mouseup,mousemove 等,那么它就拥有一个侦听器列表,其中包括它所涉及的所有类型的事件。无论触发何种事件,都会检索一遍列表,然后使列表中的每个对象都知道所发生的事件。
另一种对事件的描述是,将其看作一个加入到事件行列的侦听器成员。产生事件的对象将它所产生的事件公布给所有成员,当你不再需要这个对象进行侦听时,可以令其停止侦听或使用 removeeventlistener 方法解除该成员;就是告诉对象从侦听器列表中删除该侦听器,这样一来,他就不会再接收信息了。
让我们看看这段代码,下面是一段在舞台中创建 sprite 影片,并进行绘图,然后再为其添加侦听器的代码:
package {
import flash.display.sprite;
import flash.events.mouseevent;
public class eventdemo extends sprite {
private var eventsprite:sprite;
public function eventdemo() {
init();
}
private function init():void {
eventsprite = new sprite();
addchild(eventsprite);
eventsprite.graphics.beginfill(0xff0000);
eventsprite.graphics.drawcircle(0, 0, 100);
eventsprite.graphics.endfill();
eventsprite.x = stage.stagewidth / 2;
eventsprite.y = stage.stageheight / 2;
eventsprite.addeventlistener(mouseevent.mouse_down,onmousedown);
eventsprite.addeventlistener(mouseevent.mouse_up,onmouseup);
}
private function onmousedown(event:mouseevent):void {
trace("mouse down");
}
private function onmouseup(event:mouseevent):void {
trace("mouse up");
}
}
}
在初始化函数(init)中创建一个 sprite 影片,并在里面画圆,置于舞台中心,最后两句是为它添加两个侦听器,侦听鼠标按下(mouse_down)和鼠标弹起(mouse_up)这两个事件。它们是mouseevent 类的两个属性,而这个类必需要导入。最后定义两个处理函数 onmousedown 和 onmouseup。
由事件对象调用事件处理函数,通常还会包括一些事件信息。在处理鼠标事件时,就包括触发该事件时鼠标位置的信息如:鼠标点击在按钮上。对于键盘事件,就要包括按下键时的信息如 ctrl,alt,shift等。把上述示例保存为 eventdemo.as 文件,并选择一种前面讲过的编译方式。当运行 swf 时,就会看到每次点击或图形时,都会输出 pressed 或 released。
帧循环的理念,存在于 flash 最早的版本中,那时 actionscript 还不像今天那么强大。把代码写入关键帧,并在下一帧中写入像 gotoandplay 这样的语句,使播放头(playhead)回到前一帧。这样两帧之间就形成了一个无限循环,每当播放头到了代码帧上时,就会执行那些代码。例如,在舞台上有一个实例名为 ball 的影片剪辑。
第一帧的代码就像这样:
ball.x ;
第二帧的代码如下:
gotoandplay(1);
实际上第二帧不需要做任何事,只是让时间轴自动回到第一帧而以。另一个版本是建立三个帧,第一帧进行初始化,写入只执行一次的代码,不进行循环。第二帧才是主要的执行代码,第三帧只写 gotoandplay(2); 这个方法在早期 flash 版本中常被使用,虽然有点过时,但是同样可以出色地完成任务。马上我们还要学到更灵活更强大的设置方法,但今后你会发现其实原理上是一样的。
影片事件
影片事件在 as 3 中彻底的消失了,这真是件好事。但还要捎带提一下,回顾 flash 5 的时代,只有帧循环和影片剪辑事件两种选择。影片事件指代码直接写在影片剪辑上,而不是帧上。如何实现影片事件,首先选择舞台上的影片剪辑,然后打开动作面板并将代码写在上面,这些代码只对该影片剪辑有效。所有代码必需写在事件块中,比如:
onclipevent(eventname){
// code goes here
}
对于 onclipevent(eventname),作用于 eventname(某种事件)。对于"on"类型事件则必需指定鼠标或键盘事件,如按下(press)和释放(release)。
事件名称(eventname)是指许多flash 影片事件之一,所谓事件就是在影片中发生的事。事件分为两种:系统事件和用户事件。系统事件指发生在如计算机,flash,或影片上的事件,比如调取数据,调取信息,或播放帧等。用户事件是指用户所做的一些事,基本上就是鼠标和键盘两种。影片事件使用得最多的就是 load 和 enterframe 这两个。 load 事件会在影片第一次出现在舞台上时才执行,且只执行一次。所以说非常适合在这里面写入初始化代码。只要把代码写在大括号间即可:
onclipevent(load){
// initialization code
}
我们可以把带有如下代码的影片剪辑放入时间轴上(注意:此处为 as 1 写法):
onclipevent (load) {
this._x = 100;
this._y = 100;
}
onclipevent (enterframe) {
this._x = 5;
}
本书示例中的代码不使用这种写法(因为它已经不是一种语言了),但不论使用何种方法,初始化(initialization),重复动作(repeating actions)和屏幕刷新(screen refresh)都是非常重要的。
事件及事件处理
flash mx 的 actionscrpt 发生了重要的改变,这些转变与革新为 flash 成为真正的富客户端程序(ria)奠定了基础。其中一个就是全新的事件结构,在编写非常复杂的行为时比之前的版本好用很多。 flash mx 之前的版本,只能把代码放在影片和按钮的 onclipevent(eventname) 或 on(eventname) 这两种事件处理方法中。这就意味着,在设计的时候就要把影片剪辑放到舞台上,并把代码写入影片剪辑中。mx 的事件结构并不完美,但与之前版本来说已经有了长足的进步,并允许我们在任何时候访问任何事件,或是停止处理任何事件,或是动态改变某个事件的行为,可以想象这有多么的强大和灵活。
要想了解事件,就要明白下面几条概念:侦听器(lintener)与处理函数(handler),这两个名字很贴切,侦听器就是侦听事件的对象,处理函数是一个用于处理所要发生的事件的函数。侦听与处理在 actionscript 的发展过程中进行过很多次演变,在 as 2 中就有很多不同的实现方法。为了避免混乱,我很推崇 as 3,因为它简化了这个过程,使事件处理变得更方便更一致。
事件侦听器与处理函数
前面说过,侦听器是一个用于侦听事件的对象。我们可以设计一个类,通过调用addeventlistener 函数为某事件指定一个侦听器。输入要侦听的事件名称以及要执行处理的函数名称。看一个例子:
addeventlistener("enterframe", onenterframe);
在加入事件侦听器时,可使用可选参数,本书中不会用到;对于大多数的应用程序来说,会使用以上这种写法就够用了。请注意事件名"enterframe"为字符串型,戏称它为“魔力字符串”(magic string)。为什么这么叫?如果你误输入成了"entorframe",尽管没有这个事件名称,编译器也会编译执行它,会发现事件处理函数没有执行。但 as 3 仍会对其进行处理,除了使用“魔力字符串”以外,还可以使用事件类(event class)的属性。例如:
addeventlistener(event.enter_frame, onenterframe);
实际上 event.enter_frame 的值就是”enterframe”这个字符串。那么这个属性也可能输错就像 event.entor_frame ,但这种方法好在,如果输入错误了,程序会拒绝编译,并提示你在事件类中不存在该属性。编译器会提示发生错误的行及确切的字符。所以,最好使用这种方法,除非编译器会帮我们修正错误或编写代码。
除此之外,还有其它的事件类型如:mouseevent.mouse_down,keyboardevent.key_down,timerevent.timer 等。这些都由 "mousedown" , "keydown" , "timer" 这样的简单字符串来表示,如果你记不住这些字符串,那么最好就去使用事件类的属性。
另一个重点是,使用 addeventlistener 函数直接调用类中的函数。有时,需要侦听另一个对象产生的事件,例如,有一个名为 myspritebutton 的 sprite 影片(sprite):影片或按钮,能完成按钮的动作。当用户点击它的时候就会产生 mousedown(鼠标按下)事件。侦听该 sprite 影片的 mousedown 事件,就要调用该对象的 addeventlistener 方法,如下:
myspritebutton.addeventlistener(mouseevent.mouse_down, onspritepress);
最后一点,必需要有事件处理函数如 onenterframe,在 as 3 中,可以任意地为事件处理函数命名,这点与以前的 actionscript 不同。在 enterframe 示例中,使用 onenterframe 做事件处理函数,是因为我们习惯使用这个名称。在 as 3 中,onenterframe 已不再是关键字,当然也可以为这个处理函数命名为 move,run,或是 dosomethingcool。然而,我们已经习惯使用”on”表示事件开始,后面跟一些描述词如 onstartbuttonclick,onconfigxmlload 或 onroketcrash。有些朋友喜欢在事件名后面加上 "handler" 作为后缀,如: enterframehandler,这只是个人偏好问题。
侦听器用于侦听事件,但对于一个侦听器来说,也许会同时侦听很多事件。在系统内部,一个事件对象拥有一个包括了所有对象及自身的侦听器的列表。如果一个对象能够产生多种不同类型的事件,如 mousedown,mouseup,mousemove 等,那么它就拥有一个侦听器列表,其中包括它所涉及的所有类型的事件。无论触发何种事件,都会检索一遍列表,然后使列表中的每个对象都知道所发生的事件。
另一种对事件的描述是,将其看作一个加入到事件行列的侦听器成员。产生事件的对象将它所产生的事件公布给所有成员,当你不再需要这个对象进行侦听时,可以令其停止侦听或使用 removeeventlistener 方法解除该成员;就是告诉对象从侦听器列表中删除该侦听器,这样一来,他就不会再接收信息了。
让我们看看这段代码,下面是一段在舞台中创建 sprite 影片,并进行绘图,然后再为其添加侦听器的代码:
package {
import flash.display.sprite;
import flash.events.mouseevent;
public class eventdemo extends sprite {
private var eventsprite:sprite;
public function eventdemo() {
init();
}
private function init():void {
eventsprite = new sprite();
addchild(eventsprite);
eventsprite.graphics.beginfill(0xff0000);
eventsprite.graphics.drawcircle(0, 0, 100);
eventsprite.graphics.endfill();
eventsprite.x = stage.stagewidth / 2;
eventsprite.y = stage.stageheight / 2;
eventsprite.addeventlistener(mouseevent.mouse_down,onmousedown);
eventsprite.addeventlistener(mouseevent.mouse_up,onmouseup);
}
private function onmousedown(event:mouseevent):void {
trace("mouse down");
}
private function onmouseup(event:mouseevent):void {
trace("mouse up");
}
}
}
在初始化函数(init)中创建一个 sprite 影片,并在里面画圆,置于舞台中心,最后两句是为它添加两个侦听器,侦听鼠标按下(mouse_down)和鼠标弹起(mouse_up)这两个事件。它们是mouseevent 类的两个属性,而这个类必需要导入。最后定义两个处理函数 onmousedown 和 onmouseup。
由事件对象调用事件处理函数,通常还会包括一些事件信息。在处理鼠标事件时,就包括触发该事件时鼠标位置的信息如:鼠标点击在按钮上。对于键盘事件,就要包括按下键时的信息如 ctrl,alt,shift等。把上述示例保存为 eventdemo.as 文件,并选择一种前面讲过的编译方式。当运行 swf 时,就会看到每次点击或图形时,都会输出 pressed 或 released。
下一篇: Flash AS 教程:交互动画