没有合适的资源?快使用搜索试试~ 我知道了~
首页Flex ActionScript3入门指南:动画与OOP实战
Flex ActionScript3入门指南:动画与OOP实战
需积分: 3 4 下载量 102 浏览量
更新于2024-08-02
收藏 4.07MB PDF 举报
"《Flex ActionScript3.0动画基础》是一本专为想学习Flex的读者设计的教材,由Keith Peters撰写,由FL基理大师翻译。该书在Flash动画编程领域具有很高的声誉,旨在帮助读者系统地理解和掌握ActionScript 3.0的动画原理和技术。书中内容涵盖了广泛的动画基础知识,如基本动画概念、帧和运动、动态与静态的区别,以及ActionScript 3.0的关键特性,如类和面向对象编程(OOP)的概念。 章节内容详细,包括基类、包、导入、构造函数、继承、 Movielip/Sprite子类、文档类的创建等,指导读者如何设置和配置ActionScript 3.0的应用环境,如使用Flash CS3 IDE、Flex Builder或免费的命令行编译器。此外,书中还深入讲解了动画中的数学应用,如三角学、旋转、波形动画、圆和椭圆运动,以及颜色渲染技术。 对于用户交互,书中有丰富的鼠标和键盘事件处理,以及如何利用这些事件来实现动画控制和交互效果。此外,还介绍了显示列表和事件处理器的概念,这些都是制作动画时不可或缺的部分。 《Flex ActionScript3.0动画基础》是一本理论与实践相结合的教程,不仅适合初学者入门,也对有一定经验的开发者深入理解ActionScript 3.0动画技术大有裨益。无论是对动画编程有兴趣的个人还是企业培训,这本书都是一个宝贵的学习资源。"
资源详情
资源推荐
graphics.lineStyle(1);
graphics.moveTo(ball.x, ball.y);
graphics.lineTo(mouseX, mouseY);
这段现在看不懂没关系,大家只要知道 Flash 会在每一帧中生成这段代码,并不断地
执行。
怎样让它循环执行?看看我第一次的尝试,这也是很多 AS 初学者都会犯的错误。这是
在很多程序设计语言中都存在的循环结构,如 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 的值,把小球
从左向右移动。当值为 500 时,表达式 i<500 值为假(false),循环结束。
如果你也犯过同样的错误,就会知道,小球没有在舞台上发生移动——只是一下子出现
在了舞台的右边而已。为什么没有移动到中间的那些点上?其实它移动了,只是我们没有看
到,因为我们没有让 Flash 去刷新屏幕。图 2-6 为另一个流程图,看看实际都发生了什么。
图 2-6 为什么循环结构无法产生动画
实际上我们使用自定义规则使球移动到指定位置,并创建了 500 次新的场景。但在循环
结束之前没有给出显示,这是因为 Flash 只在每一帧结束后才进行一次刷新,这点很重要。
以下是 Flash 进入帧的动作顺序:
1.在舞台上放置所有的对象,不论在何级,何层,或是否为加载的影片。
2.执行帧上所有的 Action 脚本(ActionScript),不论在何级,何层,不论处于影片剪辑还
是按钮中,也不论它嵌套在何处。
3.判断是否到了该显示的时候。如果设置帧频为 20 帧/秒,Flash 最少要等上一帧显示后
50 毫秒后再进行下一次显示,显示了该帧后,就要编译和进入下一帧。如果帧频没有到 20
帧/秒,那么要等待到正确的时间再去执行。
定时时间存在着一些问题。首先,众所周知帧频是不精确的(即使在 Flash 9 中),不要依赖
它作为精确的定时器。其次,在大量的编译和 AS 执行花费的时间会超出规定的时间。
尽管如此,我们也不必担心自己的脚本会被砍掉一部分。在进入第 3 步之前,Flash 会
完成所有可执行代码(第 2 步),即使需要延缓帧频也要完成。Flash 为了能完成脚本,甚至
会等上 15 秒。在上面的例子中,Flash 等待循环结束,然后进入下一帧,只在跳转到下一
帧时进行屏幕的刷新。这就是为什么我们看到的是跳动而不是移动。因此,要想完成移动,
我们所要做的就是打散这个循环,请回过头参考图 2-5。
帧循环
帧循环的理念,存在于 Flash 最早的版本中,那时 ActionScript 还不像今天那么强
大。把代码写入关键帧,并在下一帧中写入像 gotoAndPlay 这样的语句,使播放头(playhead)
回到前一帧。这样两帧之间就形成了一个无限循环,每当播放头到了代码帧上时,就会执行
16
17
那些代码。例如,在舞台上有一个实例名为 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)
都是非常重要的。
18
事件及事件处理
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,这只是个人偏好问题。
19
侦听器用于侦听事件,但对于一个侦听器来说,也许会同时侦听很多事件。在系统内部,
一个事件对象拥有一个包括了所有对象及自身的侦听器的列表。如果一个对象能够产生多种
不同类型的事件,如 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。
20
动画事件
我们希望能够使用代码让物体动起来,并允许屏幕反复地刷新。前面看过一个使用
enterFrame 影片事件的示例。现在把这种方法运用到 AS 3 中,只需要增加一个
enterFrame 事件的侦听器即可:
addEventListener(Event.ENTER_FRAME, onEnterFrame);
别忘了导入 Event 类,并创建一个名为 onEnterFrame 的方法。人们常常迷惑,只有
一帧怎么能执行 enterFrame(进入帧) 事件呢?事实上,播放头并非真正地在进入下一帧,
它只停留在第一帧上,并不是把播放头移动到下一帧才形成了 enterFrame 事件,而是用另
一种方法:Flash 告诉播放头何时进行移动,可以把 enterFrame 看成一个定时器,只是有
些不精确。
下面我们看看第一个 AS 3 动画:
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 函数负责 ball 的运动及屏幕刷新工作。这是学习本书内容的基础,也是使
用 ActionScript 创建动画的基础,所以务必要掌握。
显示列表
在 AS 3 之前,人们可以创建多个不同类型的可视化对象,包括影片剪辑,图形,按钮,
文本框,位图,组件和基本形状。这些对象没有真正的层次结构,它们的创建、删除、操作
方法也均不相同。比如,在 IDE 中,可以使用 attachMovie ,duplicateMovieClip 或
createEmptyMovieClip 的方法将影片剪辑放置于舞台上,文本框可以在开发环境中创建也
可以用代码创建。而在使用位图(bitmap),视频(video)及组件(component)时,它们就像是
来自于别的星球,最终被强硬地放在一起。
对于 AS 3 来说,这些对象都有了统一的归属。在舞台上所有可见的对象都继承自
剩余354页未读,继续阅读
didiaodezhu
- 粉丝: 23
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C++标准程序库:权威指南
- Java解惑:奇数判断误区与改进方法
- C++编程必读:20种设计模式详解与实战
- LM3S8962微控制器数据手册
- 51单片机C语言实战教程:从入门到精通
- Spring3.0权威指南:JavaEE6实战
- Win32多线程程序设计详解
- Lucene2.9.1开发全攻略:从环境配置到索引创建
- 内存虚拟硬盘技术:提升电脑速度的秘密武器
- Java操作数据库:保存与显示图片到数据库及页面
- ISO14001:2004环境管理体系要求详解
- ShopExV4.8二次开发详解
- 企业形象与产品推广一站式网站建设技术方案揭秘
- Shopex二次开发:触发器与控制器重定向技术详解
- FPGA开发实战指南:创新设计与进阶技巧
- ShopExV4.8二次开发入门:解决升级问题与功能扩展
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功