关闭

关闭

关闭

封号提示

内容

首页 Flash ActionScript3.0 动画教程.pdf

Flash ActionScript3.0 动画教程.pdf

Flash ActionScript3.0 动画教程.pdf

上传者: 小倬 2012-07-19 评分 0 0 0 0 0 0 暂无简介 简介 举报

简介:本文档为《Flash ActionScript3.0 动画教程pdf》,可适用于人文社科领域,主题内容包含MakingThingsMove序FL基理文(:)书名:FoundationAtionsriptAnimation作者:KeithPeters翻译/符等。

MakingThingsMove序FL基理文(:)书名:FoundationAtionsriptAnimation作者:KeithPeters翻译/编辑/润稿:FL基理大师翻译就是还原即反映作者的真正意图这是件很不容易的事。翻译该书完全本着对Flash的热爱也是对自己的一次挑战望朋友们多提宝贵意见。本书在业界享有盛名内容深入浅出适合各个层次的学习者能够让读者对Flash动画编程有一个全面系统的了解是学习AtionSript的良师益友。FL基理大师插入号MakingThingsmove目 录  说明红色字体表明缺少该部分作者没有翻译。 第一部分ActionScript动画基础  第章 基本动画概念  什么是动画帧和运动帧就是记录程序帧动态动画VS静态动画小结第章ActionSript 动画基础  动画基础关于ActionSript版本类和面向对象编程基类包(Package)导入(Import)构造函数(Constructor)继承(Inheritance)MovielipSprite子类创建文档类(Documentclass)设置AtionSript应用程序使用FlashCSIDE(集成开发环境)使用FlexBuilder使用免费的命令行编译器关于跟踪缩放影片程序动画动画的执行过程帧循环影片事件事件和事件处理事件侦听器与处理函数动画事件显示列表用户交互鼠标事件鼠标位置键盘事件键码小结第章 三角学应用  什么是三角学(Trigonometry) 角  弧度制(radian)与角度制(degrees)Flash坐标系三角形的边三角函数正弦(Sine)余弦(Cosine)正切(Tangent)反正弦(Arcsine)和反余弦(Arccosine)反正切(Arctangent)旋转(Rotation)波形平滑的上下运动线性垂直运动心跳运动双角波形绘制波形圆和椭圆圆形运动椭圆运动勾股定理两点间距离本章重要公式小结第章 渲染技术  Flash中的颜色使用十六进制表示颜色值透明度和位色新的数值类型:int和uint色彩合成获取颜色值绘图API 绘图对象  使用 clear 删除绘制  使用lineStyle设定线条样式   使用 lineTo 和 moveTo 绘制直线  过控制点的曲线  使用 beginFill 和 endFill 创建图形  使用beginGradientFill创建渐变填充 颜色变换滤镜(Filter)创建滤镜动态滤镜位图读取和嵌入资源读取资源嵌入资源本章重点公式小结第二部分 基本运动  第章 速度与加速度  速度向量(Velocity) 向量与速度向量单轴速度两个轴上的速度  速度向量扩展速度扩展  加速度  单轴加速度双轴加速度重力加速度  角加速度制作飞船本章重要公式小结  第章 边界与摩擦力  环境边界设置边界移除物体重置对象屏幕环绕回弹摩擦力摩擦力,正确方法摩擦力简便的方法摩擦力的应用本章重要公式小结第章 用户交互:移动物体  按下和放开精灵拖拽影片使用mouseMove执行拖拽使用startDragstopDrag执行拖拽结合运动代码的拖拽投掷小结第三部分 高级运动  第章 缓动和弹性  成比例运动缓动简单的缓动缓动何时停止移动的目标缓动不仅限于运动高级缓动弹性一维坐标上的弹性运动二维弹性运动向移动目标运动弹簧在哪?弹簧链多目标点弹性运动目标偏移弹簧连接多个物体本章重点公式小结第章 碰撞检测  碰撞检测方法hitTestObject与hitTestPoint碰撞检测两个影片影片与点的碰撞检测使用shapeFlag执行碰撞检测hitTest总结基于距离的碰撞检测简单的距离碰撞检测弹性碰撞多物体碰撞检测方法基本的多物体碰撞检测多物体弹性其他的碰撞检测方法本章重要公式小结第章 坐标旋转和角度回弹  简单的坐标旋转高级坐标旋转单物体旋转多物体旋转沿角度回弹实现旋转优化代码动态效果修正“跌落”问题多角度反弹本章重点公式小结第章 台球物理  质量动量动量守恒单轴上的动量守恒两个轴上的动量守恒本章重点公式小结第章 粒子引力和重力  粒子(Particles)重力万有引力碰撞检测及反作用轨道运动弹性引力与弹性弹性节点花园结点的连接有质量的结点本章重要公式小结第章 正向运动:行走  正向和反向运动学介绍正向运动学编程准备单关节运动双关节的运动自动运行创建自然的行走循环动态调整使它真正地行走给它一些空间加入重力控制碰撞控制反应屏幕折回小结第章 反向运动:拖动和伸展  单物体的拖拽与伸展单关节伸展单关节拖拽多关节拖拽拖动两个关节拖拽更多的关节多关节伸展运动抓住鼠标抓住一个物体加入一些交互使用标准的反向运动学方法余弦定律介绍ActionScript余弦定律本章重要公式小结第四部分 D动画  第章 D基础  第维和透视z轴透视公式速度和加速度回弹单个物体回弹多物体回弹z轴排序重力折回缓动和弹性缓动弹性坐标旋转碰撞检测本章重点公式小结第章 D线条和填充  创建点和线创建图形创建D填充D实体建模建立旋转立方体模型建立其它形状的模型移动D实体模型小结第章 背面剔除和D灯光  背面剔除深度排序背面剔除深度排序D灯光小结第五部分 其他技术  第章 矩阵数学  矩阵基础矩阵运算矩阵加法矩阵乘法Matrix类小结第章 实用技巧汇集  布朗(随机)运动随机分布方形分布圆形分布偏向分布基于定时器和时间的动画基于定时器的动画基于时间的动画相同质量物体之间的碰撞声音集成有用的公式Making Things Move! 结束语 第一章基础动画概念Flash就是一台动画机器。从Flash最早的版本开始就支持补间动画只需要创建两个不同的关键帧然后让Flash自动创建补间动画即可。本书将介绍Flash中的一种强大的语言ActionScript。该书包括了编程数学物理等技术并结合ActionScript让物体动起来这些都是补间动画无法比拟的。什么是动画?“动画”一词引用美国传统词典中的解释使有生命充满生命力给予兴趣给予热情使有活力鼓励激励:使充满精神、勇气或决心鼓励怂恿驱使推动驱动使栩栩如生地运动:生产设计或制作(如卡通片)使之产生运动错觉前四个哲学定义很好理解而我们真正要讨论的是第五、六个定义动画意味着运动。就从这一点开始说起动画要随着时间而变化尤其指视觉上的变化。运动基本上表现为物体随着时间发生位置上的变化开始在这里一会儿又在那里。理论上讲物体也曾介于两点之间某个位置但我也不能给出纯粹哲学的解释(至少现在还不能)。随着时间的流逝物体开始在这一点而后又到了那一个点。帧和运动研究人员发现图像以每秒钟帧的速度播放最容易被看成运动的图像。比这个速度再慢些会由于停顿时间较长而引起跳帧破坏了影像的连贯。人类的眼睛似乎也不能分辨比这个帧频再快的速度从理论上讲就算以每秒帧的速度播放也不会使动画变得更真实(虽然快速的帧频会引起程序动画更多的交互响应看上去会更平滑)。动态动画 VS 静态动画  使用程序动画的好处不仅是文件大小的问题这也是程序动画成为动态动画的根本。大家是否看过泰坦尼克这部电影?希望还记得一些但沉船这件事却是每次都发生的不论是在电影院家庭录像机还是DVD中。不管是按下短暂的停止还是暂停都不会阻止沉船事件这是因为电影是由一连串静止的图像组成的。要是在我们的电影里有一些物体可以使用鼠标或键盘来改变它们那又会怎样?允许用户与屏幕上的物体进行交互这样的效果远超过了静态动画你甚至可以挽救泰坦尼克!   小结 那么所有这些内容的要点在哪里呢?这个开篇已经介绍了一些动画的基础知识。但是你实际能用它做什么呢?这完全取决与你。 在下面的章节中我会提供一些工具并快速教你如何使用它们。使用这些工具做什么完全由你决定。本书中最明显的应用就是创建游戏。游戏本质上是设定某些目标由玩家来完成的交互动画。但是我不想让它变成一本游戏书。我已经在某种专业工作(除了游戏)中使用了这里几乎所有的技术从很炫的D菜单和一些看上去不错的导航系统到广告和教育的应用。 有一个警告:拿起任何一本关于网页设计的书你将会发现有一章告诉你动画是如何不好。我并不同意这一点但是对此我并不想多说什么。如果你想了解动画接下来的几百页内容将为你提供所需要的全部知识。                       第二章ActionScript动画基础类和面向对象编程类(Class)和面向对象(ObjectOriented)对于有些读者来说可能还没接触过而有些读者可能已经在AS(或其它语言)中使用过很多年了为了让大家都能学会我会扼要的介绍一下这些基础知识。就算是AS的OOP专家也希望能略读下这一段因为AS的工作原理确实发生了很大的变化。如果你说你从没用过类那你就错了只要你在Flash中写过代码那么实际上就已经使用了类。类可以简单理解为一种对象MovieClip就是影片剪辑的类而文本框、影片剪辑、按钮、字符串和数值等都有它们自己的类。一个类最基本的两个部分:属性(数据或信息)行为(动作或它能做的事)。属性(Property)指用于保存与该类有关的信息变量行为(Behavior)就是指函数如果一个函数是这个类中的一部分那么我们就称它为方法(Method)。一个基本的类:常用Flash的朋友都知道我们可以在库中创建一个元件用这个元件可以在舞台上创建出很多的实例。与元件和实例的关系相同类就是一个模板而对象(如同实例)就是类的一个特殊表现形式。下面来看一个类的例子:package{publicclassMyClass{publicvarmyProperty:Number=publicfunctionmyMethod(){trace("Iamhere")}}}先来说明一下这段代码。在这里有些新的知识对于AS老手也如此:包的声明。包(Package)作用就是把相关的类进行分组。知道这一点就够了我们不再进行深入的讨论本书的示例甚至不会用到包。Package这个关键字和一对大括号是必需有的我们理解为默认包紧随其后的就是类的定义。另一个变化是AS中的类拥有了访问关键字。访问关键字是指:一个用来指定其它代码是否可访问该代码的关键字。public(公有类)关键字指该类可被外部任何类的代码访问。本书中所有示例的类都是public的。在深入学习了AS后我们会发现不是所有类都是公有的甚至还有多重的类这些内容超出了本书的谈论范围。本例中我们可以看到这个类的名字为MyClass后面跟一对大括号。在这个类中有两种要素一个是名为myProperty的变量另一个是名为myMethod的函数。包(Package)包主要用于组织管理类。包是根据类所在的目录路径所构成的并可以嵌套多层。包名所指的是一个真正存在的文件夹用“”进行分隔。例如有一个名为Utils的类存在于文件夹comfriendsofedmakingthingsmove中(使用域名作为包名是一个不成文的规定目的是保证包名是唯一的)。这个类就被写成comfriendsofedmakingthingsmoveUtils。在AS中使用整个包名来创建一个类例如:classcomfriendsofedmakingthingsmoveUtils{}在AS中包名写在包的声名处类名写类的声名处例如:packagecomfriendsofedmakingthingsmove{publicclassUtils{}}导入(Import)想象一下每次要使用这个类的方法时都要输入comfriendsofedmakingthingsmoveUtils是不是太过烦琐太过死板了。别担心import语句可以解决这个问题。在这个例子中可以把下面这句放在package中类定义的上面:importcomfriendsofedmakingthingsmoveUtils。构造函数(Constructor)构造函数是指一个名字与类名相同的方法。当该类被实例化时该函数会被自动调用也可以传入参数例如:首先创建一个类:package{publicclassMyClass{publicfunctionMyClass(arg:String){trace("constructed")trace("youpassed"arg)}}}然后假设工作在FlashCSIDE(集成开发环境)中在时间轴上创建该实例:varmyInstance:MyClass=newMyClass("hello")结果输出:constructedyoupassedhello继承(Inheritance)一个类可以从另一个类中继承(inherit)和扩展(extend)而来。这就意味着它获得了另一个类所有的属性和方法(除了那些被private掩盖住的属性)。所生成的子类(派生类)还可以增加更多的属性和方法或更改父类(基类)已有的属性或方法。要分别创建两个类来实现(两个独立的as文件)例如:package{publicclassMyBaseClass{publicfunctionsayHello():void{trace("HellofromMyBaseClass")}}}package{publicclassMySubClassextendsMyBaseClass{publicfunctionsayGoodbye():void{trace("GoodbyefromMySubClass")}}}不要忘记每个类都必须在其自身的文件中文件名为该类的类名扩展名as所以必须要有MyBaseClassas文件和MySubClassas文件。因此在使用FlashCSIDE时保存的FLA文件要与这两个类在同一个文件夹。下面代码会生产两个实例把它写入时间轴看看会发生什么:varbase:MyBaseClass=newMyBaseClass()basesayHello()varsub:MySubClass=newMySubClass()subsayHello()subsayGoodbye()第一个实例没什么可说的值得注意的是第二个实例中的sayHello方法虽然在MySubClass中没有定义sayHello但它却是继承自MyBaseClass类的。另一个值得注意的是增加了一个新的方法sayGoodbye这是父类所没有的。下面说说在子类中如何改变一个父类中已存在的方法。在AS中我们可以只需要重新定义这个方法就可以了。而在AS中则必需明确地写出override关键字来进行重新定义。package{publicclassMySubClassextendsMyBaseClass{overridepublicfunctionsayHello():void{trace("HolafromMySubClass")}publicfunctionsayGoodbye():void{trace("GoodbyefromMySubClass")}}}请注意原来的sayHello方法被重写再调用MySubClass后就有了新的信息。另外私有成员也不能被重写因为它们只能被它们自身的类访问。MovieClipSprite子类我们可以自己写一个类然后让另一个类去继承它。在AS中所有代码都不是写在时间轴上的那么它们一开始都要继承自MovieClip或Sprite。MovieClip类是影片剪辑对象属性和方法的ActionScript模板。它包括我们所熟悉的属性如:影片的x,y坐标缩放等这些在AS中的变化不大。AS还增加了Sprite类通常把它理解为不在时间轴上的影片剪辑。很多情况下只使用代码操作对象并不涉及时间轴和帧这时就应该使用Sprite这个轻型的类。如果一个类继承自MovieClip或Sprite那么它会自动拥有该类所有的属性和方法我们还可以为这个类增加特殊的属性和方法。例如游戏设计一个太空船的对象我们希望它拥有一个图形并且在屏幕的某个位置移动旋转并为动画添加enterFrame侦听器还有鼠标、键盘的侦听等。这些都可以由MovieClip或Sprite来完成所以就要继承自它们。同时还可以增加一些属性如:速度(speed)、油量(fuel)、损坏度(damage)还有像起飞(takeOff)、坠落(crash)、射击(shoot)或是自毁(selfDestruct)等方法。那么这个类大概是这样的:package{importflashdisplaySpritepublicclassSpaceShipextendsSprite{privatevarspeed:Number=privatevardamage:Number=privatevarfuel:Number=publicfunctiontakeOff():void{}publicfunctioncrash():void{}publicfunctionshoot():void{}publicfunctionselfDestruct():void{}}}注意首先要导入flashdisplay包中的Sprite类如果要导入MovieClip类同样也需要导入这个相同的包flashdisplayMovieClip类。创建文档类(Documentclass)现在我们对类已经了一定的了解接下来看看如果真正地使用它。有时候我常说基于AS的SWF是多么的重要这是因为AS引入了一个全新的概念文档类(documentclass)。一个文档类就是一个继承自Sprite或MovieClip的类并作为SWF的主类。读取SWF时这个文档类的构造函数会被自动调用。它就成为了我们程序的入口任何想要做的事都可以写在上面如:创建影片剪辑画图读取资源等等。如果在FlashCSIDE中写代码可使用文档类也可以选择继续在时间轴上写代码。但如果使用FlexBuilder或免费FlexSDK那里没有时间轴唯一的办法就是写在类中。这些工作一切都围绕着强大的文档类而展开没有它就没有SWF。以下是一个文档类的框架:package{importflashdisplaySpritepublicclassTestextendsSprite{publicfunctionTest(){init()}privatefunctioninit():void{写代码处}}}如果你看过前面的部分不会认为这是个新知识只不过是把他们放在了一起而已。使用默认包导入并继承Sprite类。构造函数只有一句调用init方法。当然也可以把所有代码写在构造函数里但是要养成一个好习惯就是尽量减少构造函数中的代码所以把代码写到了另一个方法中。本书会给大家很多代码块进行测试那时要像上面这个例子一样把代码块放入init方法中这样在影片编译执行时就会调用init中的代码。下面我们要开始学习如何连接文档类和SWF。使用FlashCSIDE(集成开发环境)FlashCSIDE是实现文档类的最方便的工具。把上述的类选择一个文件夹进行保存文件名为Testas。打开FlashCS创建一个FLA文件保存到一这个类相同的目录下。确认FLA默认发布设置为FlashPlayer及AS。在属性面板中我们注意到出现了一个名为文档类(DocumentClass)的区域(图)。只需输入类名:Test。图设置文档类请注意我们输入的是类名而不是文件名。所以这里不需要输入扩展名as。如果这个类包涵在一个包中那么就需要输入类的完整路径例如:comfriendsofedchapterTest。程序动画下面再来学习一些AS编程的基本原理。如果你已经选择好了一个开发环境那么就出发吧。让我们进入ActionScript动画世界。动画的执行过程几乎所有的程序动画都包括几种不同的执行过程。对于逐帧动画来说意味着创建和存储一组连续的位图每一帧都是一幅图像只需要进行显示即可见图。图逐帧动画当我们在Flash中使用图形或元件时事情就发了微妙的变化。这时Flash不会为每一帧创建和存储新的位图。对于每一帧而言Flash存储的是舞台上每个对象的位置大小颜色等等。比如一个小球在屏幕上移动每一帧只存储小球的在该帧上的位置第帧小球的位置在左边第个像素第帧也许就在第个像素等等。Flash播放器(FlashPlayer)读取这些信息再根据这些信息的描述来渲染舞台并显示该帧。根据这些变化扩展一下流程图见图。图渲染并显示帧我是这样描述一个动态程序动画的见图。图脚本动画如图所示没有第帧、第帧的概念脚本动画通常只由一帧完成。下面我们就来看看动画的执行过程。首先建立初始化。舞台中放入一个影片剪辑再创建补间动画或使用代码来描述整个场景。总之最后都要对该帧进行渲染及显示。然后应用自定义规则。规则可以像“让球向右移动像素”这样简单也可以是由几十条复杂的三角函数组成。使用自定义规则会产生新的描述再根据这些描述进行渲染及显示并不断地应用这个规则。请注意同一规则被一遍又一遍地执行而不是对第帧用一套规则而对第帧又使用另一套规则。所以难度就在于一套规则要处理所有可能出现的情况。要是球向右移动得过远超出了舞台怎么办?你的这套规则就要解决这个问题。是否还希望用户通过鼠标来操作小球?那么你的规则也要把它考虑进去。听起来很复杂其实不然这里所说的“规则”实际上就是ActionScript代码。每套规则都可由一行或多行代码组成。下面是小球向右移动像素的例子:ballx=ballx这句话是说无论小球X坐标(水平轴)在哪里都在原来的X位置上增加像素并把该坐标作为它的新X坐标。也可简化为:ballx=“=”操作符:把右边的值与左边的变量相加相加的结果再赋值给该变量。以下是更多的高级规则日后会学到:vardx:Number=mouseXballxvardy:Number=mouseYballyvarax:Number=dx*springvaray:Number=dy*springvx=axvy=ayvy=gravityvx*=frictionvy*=frictionballx=vxbally=vygraphicsclear()graphicslineStyle()graphicsmoveTo(ballx,bally)graphicslineTo(mouseX,mouseY)这段现在看不懂没关系大家只要知道Flash会在每一帧中生成这段代码并不断地执行。怎样让它循环执行?看看我第一次的尝试这也是很多AS初学者都会犯的错误。这是在很多程序设计语言中都存在的循环结构如for和while。用循环结构使代码重复执行这就是我曾写的那段:for(i=i<i){ballx=i}看起来相当简单。变量i从开始所以小球X坐标移动到舞台最左边。i让i的值每次增长即:~~~~…每次这个值都会做为ballx的值把小球从左向右移动。当值为时表达式i<值为假(false)循环结束。如果你也犯过同样的错误就会知道小球没有在舞台上发生移动只是一下子出现在了舞台的右边而已。为什么没有移动到中间的那些点上?其实它移动了只是我们没有看到因为我们没有让Flash去刷新屏幕。图为另一个流程图看看实际都发生了什么。图为什么循环结构无法产生动画实际上我们使用自定义规则使球移动到指定位置并创建了次新的场景。但在循环结束之前没有给出显示这是因为Flash只在每一帧结束后才进行一次刷新这点很重要。以下是Flash进入帧的动作顺序:在舞台上放置所有的对象不论在何级何层或是否为加载的影片。执行帧上所有的Action脚本(ActionScript)不论在何级何层不论处于影片剪辑还是按钮中也不论它嵌套在何处。判断是否到了该显示的时候。如果设置帧频为帧秒Flash最少要等上一帧显示后毫秒后再进行下一次显示显示了该帧后就要编译和进入下一帧。如果帧频没有到帧秒那么要等待到正确的时间再去执行。定时时间存在着一些问题。首先众所周知帧频是不精确的(即使在Flash中)不要依赖它作为精确的定时器。其次在大量的编译和AS执行花费的时间会超出规定的时间。尽管如此我们也不必担心自己的脚本会被砍掉一部分。在进入第步之前Flash会完成所有可执行代码(第步)即使需要延缓帧频也要完成。Flash为了能完成脚本甚至会等上秒。在上面的例子中Flash等待循环结束然后进入下一帧只在跳转到下一帧时进行屏幕的刷新。这就是为什么我们看到的是跳动而不是移动。因此要想完成移动我们所要做的就是打散这个循环请回过头参考图。帧循环帧循环的理念存在于Flash最早的版本中那时ActionScript还不像今天那么强大。把代码写入关键帧并在下一帧中写入像gotoAndPlay这样的语句使播放头(playhead)回到前一帧。这样两帧之间就形成了一个无限循环每当播放头到了代码帧上时就会执行那些代码。例如在舞台上有一个实例名为ball的影片剪辑。第一帧的代码就像这样:ballx第二帧的代码如下:gotoAndPlay()实际上第二帧不需要做任何事只是让时间轴自动回到第一帧而以。另一个版本是建立三个帧第一帧进行初始化写入只执行一次的代码不进行循环。第二帧才是主要的执行代码第三帧只写gotoAndPlay()这个方法在早期Flash版本中常被使用虽然有点过时但是同样可以出色地完成任务。马上我们还要学到更灵活更强大的设置方法但今后你会发现其实原理上是一样的。影片事件影片事件在AS中彻底的消失了这真是件好事。但还要捎带提一下回顾Flash的时代只有帧循环和影片剪辑事件两种选择。影片事件指代码直接写在影片剪辑上而不是帧上。如何实现影片事件首先选择舞台上的影片剪辑然后打开动作面板并将代码写在上面这些代码只对该影片剪辑有效。所有代码必需写在事件块中比如:onClipEvent(eventName){codegoeshere}对于onClipEvent(eventName)作用于eventName(某种事件)。对于"on"类型事件则必需指定鼠标或键盘事件如按下(press)和释放(release)。事件名称(eventName)是指许多Flash影片事件之一所谓事件就是在影片中发生的事。事件分为两种:系统事件和用户事件。系统事件指发生在如计算机Flash或影片上的事件比如调取数据调取信息或播放帧等。用户事件是指用户所做的一些事基本上就是鼠标和键盘两种。影片事件使用得最多的就是load和enterFrame这两个。Load事件会在影片第一次出现在舞台上时才执行且只执行一次。所以说非常适合在这里面写入初始化代码。只要把代码写在大括号间即可:onClipEvent(load){initializationcode}我们可以把带有如下代码的影片剪辑放入时间轴上(注意:此处为AS写法):onClipEvent(load){thisx=thisy=}onClipEvent(enterFrame){thisx=}本书示例中的代码不使用这种写法(因为它已经不是一种语言了)但不论使用何种方法初始化(initialization)重复动作(repeatingactions)和屏幕刷新(screenrefresh)都是非常重要的。DisplayObject类。换句话讲这些对象都是一个大家庭的成员并以相同的形式工作使用同样的方式进行创建置入删除操作。无论创建Sprite影片影片剪辑或文本框的方法都非常相近我们需要使用new关键字来完成创建任意类型的对象。为了证明这一点请看下面三条示例:varmyTextfield:TextField=newTextField()varmyMovieClip:MovieClip=newMovieClip()varmySprite:Sprite=newSprite()如果我们创建的是一个影片剪辑或Sprite影片的话就可以直接里面进行绘制如:mySpritegraphicsbeginFill(xff)mySpritegraphicsdrawCircle(,,)mySpritegraphicsendFill()但只有这些代码还不能看到效果这就引发了接下来要讨论的显示列表。“显示列表”是个新名词可以理解为一颗由可视对象构成的树。舞台就是树根默认为可见的在舞台上我们可以有很多影片剪辑或可视对象(文本框图形等)把它们加入舞台后也就成为可见的了。这些影片中也许还嵌套着很多层的可视对象这就是我们所谓的显示列表。AS与AS显示列表最大的不同在于AS中当使用attach或createEmptyMovieClip方法创建影片剪辑时必须指定它位于树的哪个位置。这样一来影片剪辑要放置在列表的指定位置。当删除该影片时同样也无法改变它在列表中的位置或在列表中移除它。在AS中创建了一些Sprite影片后不会自动被加入显示列表。在上面的示例中我们发现创建一个Sprite后并不涉及父级影片(parent)或深度(depth)的问题这样就可以在它没有加入视觉列表之前就对其进行操作了。说到舞台(Stage)可以把这些显示对象看作是幕后的演员虽然看不到但确实存在并时刻准备着亮相的一刻我们使用addChild方法把对象加入显示列表。将文档类作为树根向里面加入孩子时会自己被设置为可见的。现在在前面的例子中再加入创建Sprite对象以及addChild方法如下:varmySprite:Sprite=newSprite()mySpritegraphicsbeginFill(xff)mySpritegraphicsdrawCircle(,,)mySpritegraphicsendFill()addChild(mySprite)如果大家有兴趣试一下这段代码的话请把它们写入前面所给的类框架的init函数中。请注意绘制出的圆默认位置是,点可以改变其x和y属性。还要注意创建新影片时不再需要像AS那样去设置深度(depth)。虽然深度管理为自动执行但我们还有指定深度或改变深度的方法这部分等将来用到时再讲。使用removeChild方法从显示列表中删除一个对象并以该对象的名字作为参数。第一删除一个对象不是去毁灭它对象依然保持原样只是暂时被移除当再次被加入到显示列表中对象仍保持原来的状态。换句话讲如果显示对象里面绘制了图形或是已加载了一些外部信息那么将它重新加入显示列表后就不必再去重绘或重载这些信息。第二把该对象重新加入显示列表后还可以为它指定处在显示列表中的位置这就是我们所熟知的重定父级。从一个影片剪辑中删除一个对象再把它加载到另一个影片中剪辑中并保持刚刚被删除时的状态在以前是不可能完成的。事实上有时并不需要去删除影片因为一个子对象只能有一个父级把它加入到另一个父级中就会自动从原来的父级中删除。请看下面示例:package{importflashdisplaySpriteimportflasheventsMouseEventpublicclassReparentingextendsSprite{事件及事件处理FlashMX的ActionScrpt发生了重要的改变这些转变与革新为Flash成为真正的富客户端程序(RIA)奠定了基础。其中一个就是全新的事件结构在编写非常复杂的行为时比之前的版本好用很多。FlashMX之前的版本只能把代码放在影片和按钮的onClipEvent(eventName)或on(eventName)这两种事件处理方法中。这就意味着在设计的时候就要把影片剪辑放到舞台上并把代码写入影片剪辑中。MX的事件结构并不完美但与之前版本来说已经有了长足的进步并允许我们在任何时候访问任何事件或是停止处理任何事件或是动态改变某个事件的行为可以想象这有多么的强大和灵活。要想了解事件就要明白下面几条概念:侦听器(lintener)与处理函数(handler)这两个名字很贴切侦听器就是侦听事件的对象处理函数是一个用于处理所要发生的事件的函数。侦听与处理在ActionScript的发展过程中进行过很多次演变在AS中就有很多不同的实现方法。为了避免混乱我很推崇AS因为它简化了这个过程使事件处理变得更方便更一致。事件侦听器与处理函数前面说过侦听器是一个用于侦听事件的对象。我们可以设计一个类通过调用addEventListener函数为某事件指定一个侦听器。输入要侦听的事件名称以及要执行处理的函数名称。看一个例子:addEventListener("enterFrame",onEnterFrame)在加入事件侦听器时可使用可选参数本书中不会用到对于大多数的应用程序来说会使用以上这种写法就够用了。请注意事件名"enterFrame"为字符串型戏称它为“魔力字符串”(MagicString)。为什么这么叫?如果你误输入成了"entorFrame"尽管没有这个事件名称编译器也会编译执行它会发现事件处理函数没有执行。但AS仍会对其进行处理除了使用“魔力字符串”以外还可以使用事件类(EventClass)的属性。例如:addEventListener(EventENTERFRAME,onEnterFrame)实际上EventENTERFRAME的值就是”enterFrame”这个字符串。那么这个属性也可能输错就像EventENTORFRAME但这种方法好在如果输入错误了程序会拒绝编译并提示你在事件类中不存在该属性。编译器会提示发生错误的行及确切的字符。所以最好使用这种方法除非编译器会帮我们修正错误或编写代码。除此之外还有其它的事件类型如:MouseEventMOUSEDOWNKeyboardEventKEYDOWNTimerEventTIMER等。这些都由"mouseDown","keyDown","timer"这样的简单字符串来表示如果你记不住这些字符串那么最好就去使用事件类的属性。另一个重点是使用addEventListener函数直接调用类中的函数。有时需要侦听另一个对象产生的事件例如有一个名为mySpriteButton的Sprite影片(Sprite):影片或按钮能完成按钮的动作。当用户点击它的时候就会产生mouseDown(鼠标按下)事件。侦听该Sprite影片的mouseDown事件就要调用该对象的addEventListener方法如下:mySpriteButtonaddEventListener(MouseEventMOUSEDOWN,onSpritePress)最后一点必需要有事件处理函数如onEnterFrame在AS中可以任意地为事件处理函数命名这点与以前的ActionScript不同。在enterFrame示例中使用onEnterFrame做事件处理函数是因为我们习惯使用这个名称。在AS中onEnterFrame已不再是关键字当然也可以为这个处理函数命名为moverun或是doSomethingCool。然而我们已经习惯使用”on”表示事件开始后面跟一些描述词如onStartButtonClickonConfigXMLLoad或onRoketCrash。有些朋友喜欢在事件名后面加上"Handler"作为后缀如:enterFrameHandler这只是个人偏好问题。侦听器用于侦听事件但对于一个侦听器来说也许会同时侦听很多事件。在系统内部一个事件对象拥有一个包括了所有对象及自身的侦听器的列表。如果一个对象能够产生多种不同类型的事件如mouseDownmouseUpmouseMove等那么它就拥有一个侦听器列表其中包括它所涉及的所有类型的事件。无论触发何种事件都会检索一遍列表然后使列表中的每个对象都知道所发生的事件。另一种对事件的描述是将其看作一个加入到事件行列的侦听器成员。产生事件的对象将

用户评论(0)

0/200

精彩专题

上传我的资料

每篇奖励 +2积分

资料评价:

/49
仅支持在线阅读

意见
反馈

立即扫码关注

爱问共享资料微信公众号

返回
顶部