论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > Flash AS编程教程
Tag:2.0,3.0菜鸟,游戏,,cs,技巧,源码,,文本,文字,函数,音乐,随机,拖拽,asp,access,xml,mc,视频教程

ActionScript 3.0动画基础-3

文章类别:Flash AS编程 | 发表日期:2008-10-6 17:43:24



ActionScript 3.0动画基础-1

ActionScript 3.0动画基础-2

ActionScript 3.0动画基础-3

ActionScript 3.0动画基础-4

本文作者:egoldy
文章出处:http://www.webstudio.com.cn
文章性质:翻译
阅读次数:2479
发布时间:2007-06-26
声明: 此文章为未出版的keith peters的ActionScript 3.0 making things move中文版样章。为书中的第二章。webstudio会在中文版出版之际,友情提供论坛forum支持。转载请注明出处,谢谢!

接上一篇.....


2.5使用代码动画

好,现在你应当已经理解了关于如何在AS3编码的足够多的基础知识。你已经选择一种开发环,你已经准备好开始了。下面让我们深入到一些ActionScript动画内容。

2.5.1循环

几乎所有的动画编码都包含一些循环。如果你想到一个逐帧动画,你可能需要有一个流程,它们将是一系列象位图一样的内容,每一帧都是一副图像并且只是需要显示而已,如下图2-3。

图2-3.逐帧动画


当你在Flash中进入到图形或是元件符号中,可能情况会有些不同。Flash不能每一帧创建和保存一张新的图像,即使是在逐帧动画中。在每一帧上,Flash保存着舞台上每个对象的位置,大小,颜色等等。因些,如果你有一个穿过屏幕的小球,那么每一帧将会保存当前帧上小球的位置。可能第一帧小球位于距左边10像素的位置,第二帧可能就是15像素,如此这样。Flash 播放器读取到这些数据,根据这些描述来设置舞台,并且显示帧。根据这些,你可以得到另外一扩展后的流程,如图2-4所示。
但是当你思考如何描述一个动态的,ActionScript动画时,它的流程看起来是这样的。如图 2-5.

图2-5. 脚本动画

如你所见到的图2-5,没有第一帧,第二帧的概念等等。ActionScript动画一般可以做到,通常都是这样,只在一帧上发生。这里你可以开始了解我的说的循环。
首先,你设置一个初始化状态。你可拖动一个影片剪辑到舞台上,如同你要创建一个补间动画。或都你可以只用代码描述整个场景。不管是哪种方法,你都要渲染和显示帧。
接下来,应用你的规则。这个规则可以简化为,“这个小球向右移动5个像素,” 或者他们可以使用复杂的三角法来制作成许多线。本书中的范例将会涉及这些范围。
应用规则将会得到一个新的状态—一个新的被渲染和显示的描述。然后不断重复的应用相同的规则。
注意那是相同的一组规则被重复的使用。你不需要为第一帧设置一组规则,然后在为第二帧设置另一组规则,如此等等。因此,你的任务的是设置一组规则它可以应付你场景中所有可能的情况。当发生了小球快速的移动右边并移出屏幕怎么办?你的规则需要考滤到它。你是否允用户使用鼠标与这些小球进行交互?你的规则同样需要将它考滤进去。
它看上去有些让人害怕,但实际上它并不是真的那么复杂。基本上你都可通过一个或两个规则创建一些非常简单的行为,当它们可以正常工作时,在加入其它的规则。

这里面的”rules”规则,我一直这样叫它们,实际上就是指ActionScript声明。每一个规则可以是一个单一的声明或几个组合再或者是许多声明。在这个例子中小球向右移动5个像素,它的规则看上去如下样子:
代码:
 
ball.x  =  ball.x  +  5;
 


你只是指出了小球的x位置(水平方向),增加5,来产生一个新的x位置。你可以更简单写在如下代码:
代码:
 
ball.x  +=  5;
 

+=操作符只是将右边的值增加到左边的变量中。并将结果指定给变量。
下面是本书中稍微高级一点的一组规则的应用。你稍后会在书的后面看到:
代码:
 

var  dx:Number  =  mouseX  -  ball.x;
var  dy:Number  =  mouseY  -  ball.y;
var  ax:Number  =  dx  *  spring;
var  ay:Number  =  dy  *  spring;
vx  +=  ax;
vy  +=  ay;
vy  +=  gravity;
vx  *=  friction;
vy  *=  friction;
ball.x  +=  vx;
ball.y  +=  vy;
graphics.clear();
graphics.lineStyle(1);
graphics.moveTo(ball.x,  ball.y);
graphics.lineTo(mouseX,  mouseY);
 

现在不要提心它们是什么意思,只要知道Flash将需要运行这样的代码来生成每一个新的帧。
那么,你是如何让他们循环运行的呢? 我将展示给你我的第一次尝试,它也会是许多初学ActionScript的用户易出现的错误。它是基于几乎所有的程序语言中都有的基本循环架构,如for和while。你可以使用它们中的一种架构来设置循环,它将会使代码在其内容重复执行。这面是我所做的:
代码:
 

for(i  =  0;  i  <  500;  i++){
ball.x  =  i;
}
 


它看上去非常的简单。变 量i的初始值为0,小球影片剪辑放在舞台上x轴0的位置。i++会使变量i在循环时每次都增加1,从0到1到2,3,4,如此等等,每执行一次,值就会指定给ball.x,让它从舞台的左右移动它到右边。当i达到500时,i<500的声明就会变成false,循环就会停止。
如果你也范过同样的错误,你可能知道小球是不会穿过舞台的---它只是简单的直接显示在右边。为什么没有发生中间的移动过程呢?好,实际上它做了!你只是没有看见而已,因为你从来就没有让Flash更新屏幕。图2-6是另一个流程来显示所发生的本质。

图 2-6.为什么你不能使用for来动画

你确实应用了规则并且移动了小球的位置,创建的500次的新场景。但是直到循环结束时它才得以显示。这是因为Flash只是在最后一帧的时候才更新了场景。这是非常重要的一点。
这里是每一帧执行动作的顺序:
1.在舞台上放置好所有物体的位置,包括任何级别,任何层,载入影片剪辑,如此等等。
2.执行那一帧上所有需要被调用的ActionScript,包括任何层或级别上的任何影片剪辑或按钮,或是嵌套的影片剪辑,无论有多深。
3.检查是否有时间来显示帧。如果你设置了帧频为每秒20帧,Flash将检测是否在至少50毫秒的时间可以显示一个帧。如果可以,它将显示刚刚渲染的这一帧并且移动到下一个帧。如果不可以,它将等待直到正确的时间数量都过去。
你需要知道一些关于时间因素的问题。首先,帧频率从来都是不精确的(即便是现在的Flash Player 9影片)。不要指望他们会有严格准确的时间。第二,很可能出现渲染或ActionScript执行的时间超过分配给每一帧的时间。你不必担心你的脚本会被裁切掉,而Flash会在移到上面的第三步之前完成脚本的执行(第二部),尽管它会慢于帧频率。Flash其实会在指定的帧上为完成你的脚本等待15秒。它将会显示出一行提示信息”一个脚本导致了播放器运行缓慢……”等信息。
在前面的范例中,Flash在进入到下一帧之前,在等待For 循环的结束,并且它只在去往下一帧之前才更新屏幕。这就是为什么你只看到了一个跳跃,而不是移动。
因此,你所需要做的就是通过帧打破这种循环,因此你需要回到如图2-5所示的流程。

2.5.2帧循环

因为这本书并不是讲关于处理时间线和单独某一帧上的内容,所以我不打算给出一个确切的帧循环的例子;而在这里,我只是描述这个概念。如果你使用的是Flash CS3 IDE,它可能是一个很的教学来真正的开始你自已的范例。
说到帧循环的思路我们要回到早期版本的Flash,当时ActionScript并不象今天这样强大。它的思路是将一些代码放在一个指定的帧上,然后在另一个帧上放一个语句,通常是gotoAndPlay,它可以让播放头回到前一帧上。这样就在两帧之间形成了一个无穷的循环,每当播放头播放到有代码的帧时,就会执行帧上的代码。
比较重要需要注意的是因为它有两帧,代码被执行,屏幕被更新和显示,以及播放头的移动。这样屏幕会在每次重复执行代码时刷新,你就得到了动画。
例如,在你的舞台上有一个影片剪辑名为ball。那么第一帧上的代码应是象这样:

代码:
 
ball.x  ++;
 


第二帧的代码这样:
代码:
 
gotoAndPlay(1);
 


实际上,在这个例子中第二帧可以什么也没有,因为时间默认状态下会自动的回放。
作为对这个例子的变换,你可以设置为3个帧,第一帧是一个初始化帧,你可以在它上面放置只运行一次的任何代码,而不是循环。第二帧将包括主要的动作,第三帧为gotoAndPlay(2);
第一帧可能设置了小球的初始化位置,改变小球的颜色或大小,或做其它的什么都将只发生一次。时间线会在第2帧和第3帧之间无究的循环,运动动画和更新屏幕。
在早期的Flash 5或更早的版本中,这是一种被广范使用的方法,虽然现在看它有些不流行了,但它仍工作的很有效。尽管是这样,你很快就会发现更灵活和更有力的设置方法,它非常的有教育意义,可以看到影片的不同侧面—初始化,动作,和循环---这些概念将在你后面学习每一个动画设置过程中都会继续使用。

2.5.3剪辑事件(Clip events)

感到欣慰的是剪辑事件(Clip event)已完全从AS3中移除了,但是仍执得做为一个脚注引起我们的注意。回到Flash 5的那段时期,剪辑事件(clip event)是帧循环最主要的选择对角。
剪辑事件(clip events)是指放置的代码,并不是放在时间线上,而是直接将代码放在影片剪辑自身上。它的操作方法是选择舞台上的影片剪辑然后打开ActionScript面板。当打开面板后在ActionScript面板上输入你的代码。当你在做这些并在ActionScript面板上输入代码时,这些代码就被直接指定给了那个影片剪辑。
我说这些代码被加在了影片剪辑”上”(“on”)。任何和所有的代码都在一个剪辑上并在clip event代码块中显示,它看上去象这样:

代码:
 

onClipEvent(eventName){
//  代码写在这里
}
 

除了onClipEvent(eventName)之外,还有on(eventName),这个”on”事件还作用于鼠标和键盘动作,如按下(press)和松开(release)。
事件名称是指许多可能在Flash影片中发生的事件中的一种。一个事件可以简单描述为:影片中发生的一些事情。事件可以分为两大类别:系统事情和用户事件。一个系统事件是指当一些事情发生在计算机内,Flash,或你的影片中,如象是数据正在载入,内容正在载入,或一个新的帧正在开始播放。用户事件是指用户已经做的一些事情,通常是指键盘或是鼠标活动。
对于剪辑事件来讲最常用的是load和enterFrame。Load事件发生在当一个影片剪辑实例第一次出现在舞台上并且任何实例都只运行一次。你只需要简单的将你的代码放在两个小括号中即可:
代码:
 

onClipEvent(load){
//  初始化代码
}
 

enterFrame事件发生在Flash每次准备开如渲染下一帧时,即便是只有一帧的影片。例如,如果帧频率设为每秒钟20帧,enterFrame将会大约每隔50豪秒运行一次。这个enterFrame 剪辑事件就是你经常应用“规则(ruler)”或动作代码的位置,因为你有两个需求:重复代码和每次执行后的重新显示。它看上去如下:
代码:
 

onClipEvent(enterFrame){
//  动作代码
}

 

这样,你将一个影片剪辑放置在时间线上,然后将下面的代码加在上面(注意这里是早期的AS 1语法):
代码:
 

onClipEvent(load){
this._x  =  100;
this._y  =  100;
}
onClipEvent(enterFrame){
this._x  +=  5;
}
 


另外,本书中的范例并没有使用这种设置方式(因为它不在是AS3语言中的一部分),但是有三个要点需要注意,初始化,重复动作,和屏幕刷新,它将是你在任何系统中制作任何动画的一部分。

2.5.4事件(events)和事件句柄(event handlers)

Flash MX 在ActionScript上引入了许多重要的改变---最大的改变和提升是将Flash带入到富应用开发的前沿。其中的一个最大的改变是新的事件架构,相比较之前的版本可以做出更为复杂的应用程序。
我已经介绍了一些关于事件的内容,它发生在当系统有一些事情发生或是用户通过键盘和鼠标做某些事情时。在Flash MX之前,唯一的方法是通过onClipEvent(eventName)或影片剪辑和按钮上的on(eventName)代码块来捕获事件。这意味着你不得不在创作时在舞台上放置一个影片剪辑并在它上面编写代码。尽管各种方法已被发掘,但没有一种是最理想的。MX的事件架构不能说是最好的,但是相比之前的版本而言它有一个很大的提高并且允许你从程序中的任何位置访问事件,在任何时候可以停止指定的事件,或是动态的改变一个事件的行为。你可以想象对于这种功能的提供它是多么的强大和灵活。
随着Flash MX 2004的到来,在事件架构中增加了组件框架来提高事件机能。然而,这种增强只是在原有的事件架构基础上通过增加AS2 类来实现的。这些类提供了许多附加的事件操作,对于某些情况下AS2类偿试提供的机能在事件架构的底层仍显得功能不足。
在AS3中,事件架构已经从最底层重新写过。它的速度是很快,强大,并且完全与Flash播放器集成。
要理解事件,你需理解另外两个概念:侦听者(listeners)和handlers(处理者,也有称为句柄的)。侦听者和处理者是真正的一对好名字,因为那就是他们所做的工作。一个侦听者(listener)是一个对象,它负责侦听事件。一个处理者(handler)是一个函数,当事件发生时它负责处理事件。侦听者(listener)和处理者(handler)在整个ActionScript历史中它们的执行是有很大不同的,它们甚至在As2内的执行也会有不同。为了避免混淆,我将直接讲解AS 3,在AS3整个系统中它会更纯粹,更漂亮和协调。

2.5.5    侦听者(Listeners)和处理者(handlers)

按照常规,一个侦听者是一个对象,负责侦听事件。你可以通过调用名为addEventListener的函数来指定你的类做为一个侦听者,侦听指定的事件。你需要传递想要侦听的事件名称和类中的将要被处理的函数名称。下面是一个例子:
addEventListener("enterFrame",  onEnterFrame);
当在加入事件侦听者时还可以加入其它的附加参数,但我们在这本中并没有这样做,上面的语法是你在大多数的事件应用中所必须的。
注意事件的名称,“enterFrame”,它是一个字符串,这是我们都知道的,还会带点轻视,它是一个神奇的字符串。为什么神奇?因为如果你意外的把它写错成”entorFrame”,编译器会没有任何提示神奇的接受它,即便是没有这样的事件名称,然后你将花上几个小时时间来解决一个神奇的问题,那就是为什么你的事件函数没有被调用。
但是AS3已经有了对此的处理方法。你可以使用Event类的属性,而不是去使用象“enterFrame”这样的神奇字符串。例如,在上面的例子中,你可以按下面的方式书写:
代码:
 
addEventListener(Event.ENTER_FRAME,  onEnterFrame);
 

如果你去查看Event.ENTER_FRAME的属性值,会发现它其实就是一个简单的字符串“enterFrame”。现在,你可能会想这种方式同样会非常容易写成Event.ENTOR_FRAME。但是这里的改进是如果你写错了,你的程序将拒绝编译并会正确的告诉你在Event类中没有那样的属性。它不但会精确的指示出你错在第几行,而且也会精确到这一行的哪一个单词上。它可以说好的不能再好了,除非有一天编译器可以更改你的错误,并且能为你写代码。
除了Event类的事件类型外,在其它类中还有其它的事件类型,如MouseEvent.MOUSE_DOWN,KeyboardEvent.KEY_DOWN,TimerEvent.TIMER,如此等等。而他们都等同于简单的字符串如“mouseDown”,“keyDown”,and“timer”,最好的方法是你可以忘记这些字符串而只使用属性。
下一个需要知道的重点是有些时候,如前面的例子,你可以在一个类中直接调用addEventListener函数。在这个例子中,你实际上是告诉这个类侦听它自身的enterFrame事件。在有些案例中,你想侦听由其它对象产生的事件。例如如果你有一个名为mySpriteButton的精灵(sprite),用它来做为按钮使用。当用户点击这个精灵(sprite)时,它将产生一个mouseDown事件。要侦听来自这个精灵(sprite)的mouseDown事件,你需要调用那个精灵(sprite)的addEventListener方法,如下:
代码:
 

mySpriteButton.addEventListener(MouseEvent.MOUSE_DOWN,  onSpritePress);
 

最后需要注意的事情是它不象之前版本的ActionScript,必须要用指定的事件处理函数名称如onEnterFrame,在AS3中当你加入侦听者时,你可以为你的事件处理函数命名任意的名称。在enterFrame的范例中,我使用onEnterFrame做为一个处理者(handler),那只是因为它比较适合我并且习惯于这样使用它。在AS3中,onEnterFrame已不在是固定不变的。我可以很随意的将enterFrame处理函数命名为move,run或doSomethingColl。然而按照惯例,事件处理函数通常是以on开头,后面跟随着事件的描述和可能来自于哪儿,如onStartButtonClick,,onConfigXMLLoad, 或 onRocketCrash。还有一些人喜欢在事件名称后面加上Handler后缀来做为事件处理函数名称----例如,enterFrameHandler。 那么,这只是一个偏好的问题,最重要的事情是保持一致性,你只要能做到一看到它就知道它是事件处理函数即可。

现在,我已经讲解了侦听事件的侦听者,但是可能有更准确的关于侦听者(listener)的描述:即被通知的事件。在内部,产生事件的对象保存为一个列表,每个对象已加入自身做为一个侦听者。如果一个对象能够产生不同类型的事件,如mouseDown,mouseUp,和mouseMove,它将会为它能产生的每一种事件类型保存一个侦听者列表。无论什么时候事件发生时,对象就会在相应的列表中运行一遍并且让列表中的每一个对象知道有什么事件发生了。
另一种描述事件的方法可以说成是变成一个侦听者的对象正在提交一个指定的动作。同时产生事件的对象正在向所有的提交者广播事件。
另外,如果你不在想让一个对象侦听事件,你可以告诉它停止侦听,或停止提交,通过调用removeEventListener方法来完成:
代码:
 

removeEventListener(Event.ENTER_FRAME,  onEnterFrame);
 

这就是在告诉对象从自身的侦听指定事件的侦听者列表中移除侦听者,因此它将不会在接受到其它任何的提醒。
让我们继续来看一些具体的应用。下面的代码创建一个新的精灵(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类的属性,MouseEvent类必须要先导入。作为处理者(handlers,也有人称为句柄),你传入onMouseDown和onMouseUp函数,他们要放在后面。处理者(handler)通常接收传过来的一个包含事件信息的对象。简单讲,它将包括一些对象触发事件的信息。在本例中的鼠标事件,它包括在事件发生时鼠标的位置,哪个鼠标按键被按下,等等信息。对于键盘事件,它将包括在事件过程中哪个键子被按下;其它按键的状态,如Ctrl,Alt,和Shift键。可以参考帮助文件来查看各种事件类型所包括的信息。
保存上面的例子为EventDemo.as文件并使用你选择的编译环境来编译它,如前面的描述,当你运行SWF时,你将会看到每当你在新的精灵(sprite)上按下或放开鼠标时,就会在输出面板上输出相应的信息。如果你使用的是Flex Builder 2,不要忘记是调试(debug)---而不是运行---你的程序,如果你使用的是免费的SDK,使用正确的trace方法来解决。确保你可以让它正常的工作。它是一个非常简单的例子,但是它可以很好的来检测你的开发环境是否配置正确。

如果你刚刚接触到ActionScript,你已让它正常工作并且真正的理解了它,那么恭喜你,你已经从入门级上升到中级状态了。
OK,现在你已经知道一些关于处理者(handlers)了,你可以更好的理解侦听者(listener)。在前面,我说过它是一个对象,产生事件广播事件,或通知它的事件侦听者。它是怎样做的呢?好,它准备好所有它要做的就是调用对象的函数。对象需要有正确的处理者(handler)名称。在前面的例子中,EventDemo类将它自已加入做为一个侦听者,来侦听精灵(sprite)的两个事件。在内部,精灵(sprite)为每一个事件保存了一个列表。那么它有一个mouseDown事件列表,还有一个mouseUp事件列表。它们可能只是一个简单的数组。每一个列表中包含一个主影片的引用,也就是EventDemo类的一个实例。
当用户在精灵(sprite)上点击鼠标时,精灵(sprite)就会作出反应,“哇,鼠标按下了!必须要通过侦听者!”(或者是其它象这样的什么)。然后它就会跑到mouseDown列表中并查看有什么在那里。精灵(sprite)发现有一个主影片的引用和一指定作为处理者(handler)的函数的引用在那里。在这个例子中那个函数名为onMouseDown。然后它就简单的调用侦听者的函数。如果有其它对象注册成为mouseDown事件的侦听者,他们也将在列表当中,它们已定义的处理者(handle)也将被调用。
同样的事情也会发生在鼠标抬起的动作,只是它们在mouseUp列表中。
在AS3中的需要注意一个重要技术就是最大的范围问题得到了全部的解决。这个问题有些复杂,但是一个简单的理解它的方法是哪里的事件函数在什么时候被调用。尽管AS2事件架构表面上看与AS3非常相似,在AS2中类的方法要做为事件函数被调用,只有当它是一个正在被调用对象的方法时才会执行。而不是在类中定义的对象。如果这看上去让你很糊涂,这就是它真正问题的原因,并且有一个整个的类---委派(Delegate)类---被创建只是用来试着解决这个问题的。如果这一段让你感觉很没趣,放松并且值得欣慰的是你不需要在AS3中再去想这些问题了。
以上这些就是事件和事件处理函数的基础。我们随着我们的进度继续介绍一些事件,但是现在,让我们回到动画上。

2.5.6动画事件

如上面我们谈论的所有关于事件的问题把我们带到哪儿了呢?我们正在寻找一种能够将代码应用到动画一个物体和重复刷新屏幕的方法。在前面,你已看过一个使用enterFrame的clip event来动画的范例。让我们以这项技术来做为开始。
在AS3中,你可以加入一个侦听者(listener)来侦听enterFrame事件如下:
addEventListener(Event.ENTER_FRAME,  onEnterFrame);
记得你需要先导入Event类并且创建一个真实的名为onEnterFrame的方法。
有一点会经常使人们糊涂,那就是当影片只有一帧的时候,你的enterFrame事件仍会正常的工作。(并且如果你正在使用Flex Builder 2或是SDK,你是看不到任何帧的,但是它确实是一个事实,它确实存在在那里)播放头并不是真正的进入到一个新的帧上;它只是停在第一帧上。意识到enterFrame事件并不是移动播放头到一个新的帧。而更多的是围绕着---事件告诉Flash什么时间移动播放头。可以把enterFrame想象为一个定时器,只是不是很精确。Flash会根据帧频率的设定来检测要每隔多少长时间进入到一个新的帧上。然后它就会在内部重复的执行事件。如果有其它的帧可以去,它就会播放到那里。还有一点就是,你可以计算出事件重复执行的次数。
原书p36图字
( 如果你对Flash的内部工作过程非常的感兴趣,你可以查看Tinic Uro的Blog,地址是www.kaourantin.net。Tinic是一位在Adobe工作的Flash播放器开发工程师,经常发表一些对于Flash场景背后是怎样工作的一些深度解释。)
在前面的范例中已经有了初始化代码,要么是一个初始化帧再或者是在一个onClipEvent(load)代码块中。你可能已经猜到了,这些代码都可以在init方法中发生。Init方法只能能过构造函数调用一次。你需要习惯init方法在你的影片中不会第二次被调用。如果你需要重新初始化某些变量或调用其它方法,那么就把它们放在其它的函数中并且在你需要的时候调用它们。
下面是我们第一个基于AS3的动画范例!
代码:
 

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函数用来实现动画,移动小球,之后屏幕会被刷新。它并不是很复杂,但是这是本书中所有其它内容的基础,所以要很好的理解它。
好,我们已经涉及了很多的关于如何架构ActionScript动画的内容。解释了如何应用规则来不断的重复运行,以及如何在应用了程序规则后更新屏幕来产生运动错觉。但是你能用它来移动什么呢?目前为止,你已经可以移动一个精灵(sprite),但是目前的所有代码只是简单应用在一个影片剪辑上。下一步,我们将研究如何创建精灵和影处剪辑并使用显示列表(display list)来使用显示。

未完待续
视频教程列表
文章教程搜索
 
Flash AS推荐教程
Flash AS热门教程
看全部视频教程
购买方式/价格
购买视频教程: 咨询客服
tel:15972130058