flash actionscript30游戏编程实训指导手册20.doc_第1页
flash actionscript30游戏编程实训指导手册20.doc_第2页
flash actionscript30游戏编程实训指导手册20.doc_第3页
flash actionscript30游戏编程实训指导手册20.doc_第4页
flash actionscript30游戏编程实训指导手册20.doc_第5页
免费预览已结束,剩余67页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机工程系数字媒体技术教研室ActionScript 3.0游戏编码实训指导手册程序设计实践与游戏编码V2.0 陈望明目录实践大纲1一、课程性质和任务1二、实践课程的目标1三、适用专业2四、教学方法、教学场所与设备要求2五、学时分配2六、实训成绩的评定2第 1 章: ActionScript 快速入门4变量4数据类型5类型转换6常数10运算符的优先级10决策机制11函数13实例:猜数字13第2章Flash中的面向对象程序设计16一个基本的类16继承(Inheritance)17MovieClip/Sprite 子类18创建文档类(Document class)19显示列表display list20用户交互操作21鼠标事件21鼠标位置23键盘事件23键盘代码24互动操作实例学习24交互实例一:通过按钮控制物体移动24交互实例二:用键盘控制移动29交互实例三:控行飞船飞行33第 3 章: 游戏实例37游戏实例一:蜗牛赛跑37游戏实例二:迷宫42游戏实例三:Amoebas(阿米巴、变形虫)48结束语69程序设计实践与游戏编码指导手册实践大纲一、课程性质和任务1、课程性质本课程是数字媒体专业面向对象程序设计后的一门实践课程。本课程的主要任务是:通过实践开发来加深理解面向对象程序设计在数字媒体中的应用,及加强面向对象程序设计的能力。通过实践了解游戏开发的流程和要素,并能进行初级游戏的设计与开发。2009年中国游戏行业产值高达710亿元人民币,2010年游戏行业产值有望超过900亿元人民币,全球游戏行业总值为1000亿美元,我国今年将约占世界游戏行业总值的1/7。随着我国游戏行业的迅猛发展,对游戏开发人才的需求量需求激增,目前国内的游戏开发人才缺口已达30万人, 而传统的从事软件开发的技术人员很少有专门侧重于游戏方向的,加之现有大专院校也无一针对游戏开发开设专业课程,导致能够上手开发游戏的从业人员少之又少。数字媒体技术是一门创意和开发相结合的专业,非常适合从事游戏的开发。考虑到本学期学生的编程基础还比较差,本学期的实践课采用面向对象语言ActionScript 3.0来进行游戏开发。2、实践课程设计任务任务1:掌握基本动画的设计任务2:掌握游戏程序的流程任务3:根据指导手册完成若干简单游戏的设计综合任务:以小组的方式设计完成一个或一个以上的作品。二、实践课程的目标将理论教学中涉及到的面向对象程序设计的知识点贯穿起来,实践课程是学生在课程结束前所进行的一项综合训练,是教学的一个重要环节,其主要目的有如下几个方面:1、掌握基于ActionScript 3.0语言的面向对象程序设计。2、掌握基于Flash平台的游戏编码设计3、利用所学知识,调研查阅相关信息,发挥创造力,掌握运用Flash并能与其它相关设计工具的综合应用,培养学生的职业的技能及独立设计的综合能力。三、适用专业本课程适合数字媒体专业及计算机相关专业四、教学方法、教学场所与设备要求1、教学方法:本课程是一门实践性课程,主要的实施方法和手段以课上理论知识和学生亲自动手操作相结合,以学生独立操作为主,教师指导为辅。在具体安排上采用分组的形式来进行,培养学生团队合作的精神。2、教学场所与设备:本实训课程在安装有 win XP 及Flash CS4软件的机房进行,要求学生每人一台计算机。五、学时分配总学时:32学时; 课内指导安排课时:16学时;课外开发课时:16学时;六、实训成绩的评定、成绩评定的主要依据:考核、评价项目考评人考核内容权重实训评价实训的平时考核对实训期间的出勤情况、实训态度、安全意识、职业道德素质评定成绩教师职业素质、实训态度、效率观念、协作精神10各个设计内容考核根据学生各个设计内容完成情况评定成绩教师知识掌握情况、基本操作技能、知识应用能力、获取知识能力、独立设计能力25综合作品根据作品实现的效果评定成绩教师作品的整体效果、包括内容的创新及作品的主题、难易程度等65合计1002、评定的等级:根据评分依据进行成绩评定,共划分为优秀、良好、中等、及格、不及格五个等级。并将五分制换算成百分制,其换算关系为:优:10090;良:8980;中:7970;及格:6960;不及格:59分以下。注:综合作品将进行发布第 1 章: ActionScript 快速入门因为 ActionScript 是一种编程语言,所以,如果您首先了解几个通用的计算机编程概念,则会对您学习 ActionScript 很有帮助。大家可以通过与C+比较来学习。如果大家想更详细的了解ActionScript3.0请查看老师提供的ActionScript3.0编程帮助文档。变量变量可用来存储程序中使用的值。要声明变量,在 ActionScript 3.0 中,总是需要使用 var 语句。例如,下面的 ActionScript 行声明一个名为 i 的变量:var i;如果在声明变量时省略了 var 语句,则在严格模式下会出现编译器错误,在标准模式下会出现运行时错误。要将变量与一个数据类型相关联,则必须在声明变量时进行此操作。在声明变量时不指定变量的类型是合法的,但这在严格模式下会产生编译器警告。可通过在变量名后面追加一个后跟变量类型的冒号 (:) 来指定变量类型。例如,下面的代码声明一个int 类型的变量 i:var i:int;可以使用赋值运算符 (=) 为变量赋值。例如,下面的代码声明一个变量 i 并将值 20 赋给它:var i:int;i = 20;您可能会发现在声明变量的同时为变量赋值可能更加方便,如下面的示例所示:var i:int = 20;通常,在声明变量的同时为变量赋值的方法不仅在赋予基元值(如整数和字符串)时很常用,而且在创建数组或实例化类的实例时也很常用。下面的示例显示了一个使用一行代码声明和赋值的数组。var numArray:Array = zero, one, two;可以使用 new 运算符来创建类的实例。下面的示例创建一个名为 CustomClass 的实例,并向名为 customItem 的变量赋予对该实例的引用:var customItem:CustomClass = new CustomClass();如果要声明多个变量,则可以使用逗号运算符 (,) 来分隔变量,从而在一行代码中声明所有这些变量。例如,下面的代码在一行代码中声明 3 个变量:var a:int, b:int, c:int;也可以在同一行代码中为其中的每个变量赋值。例如,下面的代码声明 3 个变量(a、b 和 c)并为每个变量赋值:var a:int = 10, b:int = 20, c:int = 30;尽管您可以使用逗号运算符来将各个变量的声明组合到一条语句中,但是这样可能会降低代码的可读性。数据类型数据类型用于定义一组值。例如, Boolean 数据类型所定义的一组值中仅包含两个值:true 和 false。除了 Boolean 数据类型外,ActionScript 3.0 还定义了其它几个常用的数据类型,如 String、Number 和 Array。您可以使用类或接口来自定义一组值,从而定义自己的数据类型。ActionScript 3.0 中的所有值均是对象,无论这些值是基元值还是复杂值。基元值是一个属于下列数据类型之一的值:Boolean、int、Number、String 和 uint。基元值的处理速度通常比复杂值的处理速度快,因为 ActionScript 按照一种尽可能优化内存和提高速度的特殊方式来存储基元值。复杂值是指基元值以外的值。定义复杂值的集合的数据类型包括:Array、Date、Error、Function、RegExp、XML 和XMLList。数据类型默认值许多编程语言都区分基元值及其包装对象。例如, Java 中有一个 int 基元值和一个包装它的 java.lang.Integer 类。Java 基元值不是对象,但它们的包装是对象,这使得基元值对于某些运算非常有用,而包装对象则更适合于其它运算。在 ActionScript3.0 中,出于实用的目的,不对基元值及其包装对象加以区分。所有的值(甚至基元值)都是对象。Flash Player 和 AdobeAIR 将这些基元类型视为特例,它们的行为与对象相似,但是不需要创建对象所涉及的正常开销。这意味着下面的两行代码是等效的:var someInt:int = 3;var someInt:int = new int(3);上面列出的所有基元数据类型和复杂数据类型都是由 ActionScript 3.0 核心类定义的。通过 ActionScript 3.0 核心类,可以使用字面值(而非 new 运算符)创建对象。例如,可以使用字面值或 Array 类的构造函数来创建数组,如下所示:var someArray:Array = 1, 2, 3; / literal valuevar someArray:Array = new Array(1,2,3); / Array constructor类型转换在将某个值转换为其它数据类型的值时,就说发生了类型转换。类型转换可以是隐式的,也可以是显式的。隐式转换又称为强制,有时由 Flash Player 或 Adobe AIR 在运行时执行。例如,如果将值 2 赋给 Boolean 数据类型的变量,则 Flash Player或 Adobe AIR 会先将值 2 转换为布尔值 true,然后再将其赋给该变量。显式转换又称为转换,在代码指示编译器将一个数据类型的变量视为属于另一个数据类型时发生。在涉及基元值时,转换功能将一个数据类型的值实际转换为另一个数据类型的值。要将对象转换为另一类型,请用小括号括起对象名并在它前面加上新类型的名称。例如,下面的代码提取一个布尔值并将它转换为一个整数:var myBoolean:Boolean = true;var myINT:int = int(myBoolean);trace(myINT); / 1隐式转换在运行时,隐式转换会发生在许多上下文中: 在赋值语句中 在将值作为函数的参数传递时 在从函数中返回值时 在使用某些运算符(如加法运算符 (+))的表达式中对于用户定义的类型,当要转换的值是目标类(或者派生自目标类的类)的实例时,隐式转换会成功。如果隐式转换不成功,就会出现错误。例如,下面的代码中包含成功的隐式转换和不成功的隐式转换:class A class B extends A var objA:A = new A();var objB:B = new B();var arr:Array = new Array();objA = objB; / Conversion succeeds.objB = arr; / Conversion fails.对于基元类型而言,隐式转换是通过调用内部转换算法来处理的,该算法与显式转换函数所调用的算法相同。下面各部分详细讨论了这些基元类型转换。显式转换在严格模式下进行编译时,使用显式转换会非常有用,因为您有时可能不希望因类型不匹配而生成编译时错误。当您知道强制功能会在运行时正确转换您的值时,可能就属于这种情况。例如,在处理从表单接收的数据时,您可能希望依赖强制功能将某些字符串值转换为数值。下面的代码会生成编译时错误,即使代码在标准模式下能够正确运行也是如此:var quantityField:String = 3;var quantity:int = quantityField; / compile time error in strict mode如果您希望继续使用严格模式,但是希望将字符串转换为整数,则可以使用显式转换,如下所示:var quantityField:String = 3;var quantity:int = int(quantityField); / Explicit conversion succeeds.转换为 int、uint 和 Number您可以将任何数据类型转换为以下三种数字类型之一:int、uint 和 Number。如果 Flash Player 或 Adobe AIR 由于某种原因而无法转换数字,则会为 int 和 uint 数据类型赋予默认值 0,为 Number 数据类型赋予默认值 NaN。如果将布尔值转换为数字,则 true 变成值 1, false 变成值 0。var myBoolean:Boolean = true;var myUINT:uint = uint(myBoolean);var myINT:int = int(myBoolean);var myNum:Number = Number(myBoolean);trace(myUINT, myINT, myNum); / 1 1 1myBoolean = false;myUINT = uint(myBoolean);myINT = int(myBoolean);myNum = Number(myBoolean);trace(myUINT, myINT, myNum); / 0 0 0仅包含数字的字符串值可以成功地转换为数字类型之一。看上去像负数的字符串或者表示十六进制值的字符串(例如, 0x1A)也可以转换为数字类型。转换过程中会忽略字符串值中的前导或尾随空白字符。还可以使用 Number() 来转换看上去像浮点数的字符串。如果包含小数点,则会导致 uint() 和 int() 返回一个整数,小数点和它后面的字符被截断。例如,下面的字符串值可以转换为数字:trace(uint(5); / 5trace(uint(-5); / 4294967291. It wraps around from MAX_VALUEtrace(uint( 27 ); / 27trace(uint(3.7); / 3trace(int(3.7); / 3trace(int(0x1A); / 26trace(Number(3.7); / 3.7对于包含非数字字符的字符串值,在用 int() 或 uint() 转换时,将返回 0 ;在用 Number() 转换时,将返回 NaN。转换过程中会忽略前导和尾随空白,但是,如果字符串中包含将两个数字隔开的空白,则将返回 0 或 NaN。trace(uint(5a); / 0trace(uint(ten); / 0trace(uint(17 63); / 0对于 ActionScript 3.0 中的 Number() 函数,会忽略前导 0。例如,在使用不同的 ActionScript 版本进行编译时,下面的代码会生成不同的输出结果:trace(Number(044);/ ActionScript 3.0 44将一种数值类型的值赋给另一种数值类型的变量时,转换并不是必需的。即使在严格模式下,数值类型也会隐式转换为其它数值类型。这意味着,在某些情况下,在超出类型的范围时,可能会生成意外的值。下面的几个示例全部是在严格模式下进行编译的,但是某些示例将生成意外的值:var myUInt:uint = -3; / Assign int/Number value to uint variabletrace(myUInt); / 4294967293var myNum:Number = sampleUINT; / Assign int/uint value to Number variabletrace(myNum) / 4294967293var myInt:int = uint.MAX_VALUE + 1; / Assign Number value to uint variabletrace(myInt); / 0myInt = int.MAX_VALUE + 1; / Assign uint/Number value to int variabletrace(myInt); / -2147483648下表概述了将其它数据类型转换为 Number、int 或 uint 数据类型的结果。转换为 Boolean在从任何数值数据类型(uint、int 和 Number)转换为 Boolean 时,如果数值为 0,则结果为 false ;否则为 true。对于Number 数据类型,如果值为 NaN,则结果也为 false。下面的示例说明在转换 -1、0 和 1 等数字时的结果:var myNum:Number;for (myNum = -1; myNum2; myNum+)trace(Boolean( + myNum +) is + Boolean(myNum);本示例的输出结果演示在这三个数字中,只有 0 返回 false 值:Boolean(-1) is trueBoolean(0) is falseBoolean(1) is true在严格模式下,系统会对布尔变量进行特殊处理,因为您不必转换即可向布尔变量赋予任何数据类型的值。即使在严格模式下,也可以将所有的数据类型隐式强制为 Boolean 数据类型。换言之,与几乎其它所有数据类型不同,转换为 Boolean 数据类型不是避免在严格模式下出错所必需的。下面的几个示例全部是在严格模式下编译的,它们在运行时按照预期的方式工作:var myObj:Object = new Object(); / instantiatevar bool:Boolean = myObj;trace(bool); / truebool = random string;trace(bool); / truebool = new Array();trace(bool); / truebool = NaN;trace(bool); / false下表概述了在从其它数据类型转换为 Boolean 数据类型时的结果:转换为 String从任何数值数据类型转换为 String 数据类型时,都会返回数字的字符串表示形式。在将布尔值转换为 String 数据类型时,如果值为 true,则返回字符串 true ;如果值为 false,则返回字符串 false 。在从 Object 类的实例转换为 String 数据类型时,如果该实例为 null,则返回字符串 null 。否则,从 Object 类转换为 String类型会返回字符串 object Object 。在从 Array 类的实例转换为 String 时,会返回一个字符串,其中包含所有数组元素的逗号分隔列表。例如,在下面的示例中,在转换为 String 数据类型时,将返回一个包含数组中的全部三个元素的字符串:var myArray:Array = primary, secondary, tertiary;trace(String(myArray); / primary,secondary,tertiary在从 Date 类的实例转换为 String 时,会返回该实例所包含日期的字符串表示形式。例如,下面的示例返回 Date 类实例的字符串表示形式(输出结果显示的是太平洋夏令时):var myDate:Date = new Date(2005,6,1);trace(String(myDate); / Fri Jul 1 00:00:00 GMT-0700 2005下表概述了在将其它数据类型转换为 String 数据类型时的结果:常数ActionScript 3.0 支持 const 语句,该语句可用来创建常量。常量是指具有无法改变的固定值的属性。只能为常量赋值一次,而且必须在最接近常量声明的位置赋值。例如,如果将常量声明为类的成员,则只能在声明过程中或者在类构造函数中为常量赋值。下面的代码声明两个常量。第一个常量 MINIMUM 是在声明语句中赋值的,第二个常量 MAXIMUM 是在构造函数中赋值的。请注意,此示例仅在标准模式下进行编译,因为严格模式只允许在初始化时对常量进行赋值。class Apublic const MINIMUM:int = 0;public const MAXIMUM:int;public function A()MAXIMUM = 10;var a:A = new A();trace(a.MINIMUM); / 0trace(a.MAXIMUM); / 10运算符的优先级下表按优先级递减的顺序列出了 ActionScript 3.0 中的运算符。在该表中,每一行中包含的运算符优先级相同。表中每一行运算符的优先级都高于出现在它下面的行中的运算符。决策机制在AS3中程序的决策主要由以下语句来执行:条件语句:ifelseifelse ifswitch循环语句:forforinfor eachinwhiledo.while大部分语法与C+或Java类似,我们来看一下大家比较不常用的forin和for eachin。for.in 循环访问对象属性或数组元素。例如,可以使用 for.in 循环来循环访问通用对象的属性(不按任何特定的顺序来保存对象的属性,因此属性可能以看似随机的顺序出现):var myObj:Object = x:20, y:30;for (var i:String in myObj)trace(i + : + myObji);/ output:/ x: 20/ y: 30还可以循环访问数组中的元素:var myArray:Array = one, two, three;for (var i:String in myArray)trace(myArrayi);/ output:/ one/ two/ threefor each.in 循环用于循环访问集合中的项,这些项可以是 XML 或 XMLList 对象中的标签、对象属性保存的值或数组元素。如下面这段摘录的代码所示,可以使用 for each.in 循环来循环访问通用对象的属性,但是与 for.in 循环不同的是, for each.in 循环中的迭代变量包含属性所保存的值,而不包含属性的名称:var myObj:Object = x:20, y:30;for each (var num in myObj)trace(num);/ output:/ 20/ 30您可以循环访问 XML 或 XMLList 对象,如下面的示例所示:var myXML:XML = JaneSusanJohn;for each (var item in myXML.fname)trace(item);/* outputJaneSusanJohn*/还可以循环访问数组中的元素,如下面的示例所示:var myArray:Array = one, two, three;for each (var item in myArray)trace(item);/ output:/ one/ two/ three函数在 ActionScript 3.0 中可通过两种方法来定义函数:使用函数语句和使用函数表达式。您可以根据自己的编程风格(偏于静态还是偏于动态)来选择相应的方法。如果您倾向于采用静态或严格模式的编程,则应使用函数语句来定义函数。在这里仅向大家介绍:使用函数语句,因为主符合大家C+的编程习惯。函数语句函数语句是在严格模式下定义函数的首选方法。函数语句以 function 关键字开头,后跟: 函数名 用小括号括起来的逗号分隔参数列表 用大括号括起来的函数体 即,在调用函数时要执行的 ActionScript 代码例如,下面的代码创建一个定义一个参数的函数,然后将字符串“hello” 用作参数值来调用该函数:function traceParameter(aParam:String):voidtrace(aParam);traceParameter(hello); / hello函数的其他概念请大家查看AS3帮助文档。实例:猜数字学编程没有任何捷径,最好的办法就是动手,看书是远远不够的,实际操作比看几遍书更有效,接下来我们通过一个游戏来学习。游戏的规则:让玩家猜一个1-100之间的数字,玩家每猜一次都会有一个提示,告诉玩家现在猜出的数字比要猜的大还是小,这样可以缩小下一次的猜测范围。每次猜测的数字都会记录下来,直到玩家猜对这个数字,游戏结束。场景设计:场景元素:开始按钮,命名为btnStart提交按钮,命名为btnSubmit一个猜数字输入框,命名为txtInput一个动态本文提示框,命名为txtTip一个历史猜测记录显示框,命名为txtHis注:元素的命名尽量使用容易反映该元素功能或用途的单词,前面加上一定的类型前缀。游戏代码:/ 全局使用的目标数字var suc:int;/ 调用游戏初始化方法init();/ 游戏初始化方法,设定游戏开始前的场景布局、状态function init():voidbtnSubmit.enabled = false;txtTip.text = 点击开始进行游戏;/ 注册2个鼠标点击事件btnStart.addEventListener(MouseEvent.CLICK, onStartHandler)btnSubmit.addEventListener(MouseEvent.CLICK, onSubmitHandler);/ 处理“开始”按钮的事件function onStartHandler(event:MouseEvent):voidbtnStart.enabled = false;btnSubmit.enabled = true;txtHis.text = ;txtInput.text = ;suc = Math.floor(Math.random()*100) + 1;/ 处理“提交”按钮的事件function onSubmitHandler(event:MouseEvent):voidvar str:String = trim(txtInput.text);if(isInteger(str)txtHis.appendText(str+-);if(int(str) suc)txtTip.text = 您猜的数字大了点,请猜一个小点的;txtInput.text = ;if(int(str) suc)txtTip.text = 您猜的数字小了点,请猜一个大点的;txtInput.text = ;if(int(str) = suc)txtTip.text = 恭喜您,猜对了;btnStart.enabled = true;btnSubmit.enabled = false;btnStart.label = 再来;elsetxtTip.text = 请输入一个1100间的数字;/ 使用正则表达式,判断参数是否为整数/ 是整数就返回true,不是就返回falsefunction isInteger(char:String):Booleanif(char = null)return false;char = trim(char);var pattern:RegExp = /-+?d+$/; var result:Object = pattern.exec(char);if(result = null) return false;return true;/ 去除参数中的前后空格function trim(char:String):Stringif(char = null)return null;return rtrim(ltrim(char);function ltrim(char:String):Stringif(char = null)return null;var pattern:RegExp = /s*/; return char.replace(pattern,);function rtrim(char:String):Stringif(char = null)return null;var pattern:RegExp = /s*$/; return char.replace(pattern,);第2章Flash中的面向对象程序设计 在Actionscript3.0中所有的编程类型都可以是一个对象,甚至一个flash游戏本身也是一个文档类的实例化,其中MovieClip 就是影片剪辑的类,而文本框、影片剪辑、按钮、字符串和数值等都有它们自己的类。一个类最基本的两个部分:属性(数据或信息),行为(动作或它能做的事)。属性(Property)指用于保存与该类有关的信息变量,行为(Behavior)就是指函数,当一个函数是类的一部分时,我们就称他为方法(Method)。类的声明和定义与C+或Java差不多,只是在写法上有一点差别。一个基本的类常用Flash的朋友都知道,我们可以在库中创建一个元件,用这个元件可以在舞台上创建出很多的实例。与元件和实例的关系相同,类就是一个模板,而对象(如同实例)就是类的一个特殊表现形式。下面来看一个类的例子:package code /类文件的组织形式public class MyClasspublic var myProperty:Number = 100; /属性public function myMethod() /构造函数 trace(I am here); /程序输出包(Package) ,作用就是把相关的类进行分组。上面这段代码表示把类MyClass文件放在当前目录的code目录中,因此包与目录一一对应。Package 这个关键字及一对大括号是必需有的,我们理解为默认包。紧随其后的就是类的定义。AS3.0 中的类拥有了访问词。访问词是指一个关键字:用来指定其它代码是否可访问该代码。public(公有类) 关键字指该类可被外部任何类的代码访问。更多的访问控制请查看帮助文档。我们可以看到,这个类的名字为 MyClass,后面跟一对大括号。包主要用于组织管理类。包是根据类所在的目录组成的,并可以嵌套多层。包名所指的是一个真正存在的文件夹,用 “.”进行分隔。例如,有一个名为 Utils 的类,存在于文件夹 com/ friendsofed/ makingthingsmove/ 中(使用域名作为包名是一个不成文的规定,目的是保证包名是唯一的)。这个类就被写成 com.friendsofed.makingthingsmove.Utils。在AS 3中,包名写在包的声名处,类名写类的声名处,例如:package com.friendsofed.makingthingsmovepublic class Utils 导入(Import)想象一下,每次要使用这个类的方法时都要输入 com.friendsofed.makingthingsmove.Utils,是不是太过烦琐太过死板了。别担心,import 语句可以解决这个问题。在这个例子中,可以把下面这句放在 package 中类定义的上面: import com.friendsofed.makingthingsmove.Utils;。构造函数(Constructor)在类中创建构造函数,构造函数是指一个名字与类名相同的方法,当该类被实例化时,该函数会被自动调用,也可以传入参数,例如:首先,创建一个类:package public class MyClass public function MyClass(arg:String) trace(constructed); trace(you passed + arg);然后,假设工作在 Flash CS4 IDE(整合开发环境)中,在时间轴上创建该实例:var myInstance:MyClass = new MyClass(hello);结果输出:constructedyou passed hello继承(Inheritance)一个类可以从另一个类中继承(inherit)和扩展(extend)而来。这就意味着它获得了另一个类所有的属性和方法(除了那些被private掩盖住的)。子类(派生类)还可以增加更多的属性和方法,或更改父类(基类)已有的属性或方法。要分别创建两个类来实现(两个独立的 .as文件),例如:package public class MyBaseClass public function sayHello():void trace(Hello from MyBaseClass);package public class MySubClass extends MyBaseClass public function sayGoodbye():void trace(Goodbye from MySubClass);不要忘记,每个类都必须在其自身的文件中,文件名为该类类名,扩展名 .as,所以必须要有 MyBaseClass.as 文件和 MySubClass.as 文件。因此,使用 Flash CS4 IDE ,存为新的 FLA 文件,与 这两个类在同一个文件夹。下面代码会生产两个实例,把它写入时间轴看看会发生什么:var base:MyBaseClass = new MyBaseClass();base.sayHello();var sub:MySubClass = new MySubClass();sub.sayHello();sub.sayGoodbye();第一个实例没什么可说的。值得注意的是第二个实例中的 sayHello 方法,虽然在 MySubClass中没有定义 sayHello,但它却是继承自MyBaseClass的。另一个值得注意的是增加了一个新的方法sayGoodbye,这是父类所没有的。下面说说,要在子类中,如何改变一个父类中已存在的方法。而在AS 3,你必需明确地写出 override 关键字,来进行重新定义。package public class MySubClass extends MyBaseClass override public function sayHello():void trace(Hola from MySubClass);public function sayGoodbye():void trace(Goodbye from MySubClass);请注意,原来的 sayHello 方法被重写,再调用 MySubClass 后,就有了新的信息。另外,私有成员(private)也不能被重写(override),因为他只能被它自身的类访问。MovieClip/Sprite 子类你或许可以自己写一个类,然后让另一个类去继承它。当你工作在AS 3,所有代码都不是写在时间轴上的,那么它们都要开始继承自 MovieClip 或 Sprite。MovieClip 类是影片剪辑对象的属性和方法的 ActionScript 模板。它包括我们所熟悉的属性如:影片的x,y坐标,缩放等。AS 3还增加了Sprite类。通常,我们理解为它为不在时间轴上的影片剪辑。很多情况下,我们只使用代码操作对象,并不涉及时间轴和帧。这时,我们就应使用 Sprite 这个轻型类。如果你的类继承自MovieClip或Sprite,那么会自动拥有该类所有的属性和方法,你还可以为这个类增加特殊的属性和方法。例如,为游戏设计一个太空船的对象,我们希望它拥有一个图形,并且在屏幕的某个位置走来走去,旋转,为动画添加enterFrame侦听,还有鼠标、键盘的侦听等。这些都可以由 MovieClip 或 Sprite 来完成,所以就要继承他们。同时,还可以增加些属性如:速度(speed)、油量(fuel)、损坏度(damage),还有像起飞(takeOff)、坠落(crash)、射击(shoot)或是自毁(selfDestruct)等方法。这个类大概可以是这个样的:package import flash.display.Sprite;public class SpaceShip extends Sprite private var speed:Number = 0;private var damage:Number = 0;private var fuel:Number = 1000;public function takeOff():void /.public function crash():void /.public function shoot():void /.public function selfDestruct():void /.注意,首先要导入flash.display包中的Sprite类。如果要导入MovieClip类,同样也需要导入这个相同的包flash.display.MovieClip。创建文档类(Document class)现在我们对类已经了一定的了解,接下来,看看如果真正地使用它。有时候我常说基于AS 3的SWF是多么的重要,这是因为AS 3引入了一个全新的概念,文档类(document class)。一个文档类就是一个继承自Sprite 或 MovieClip的类,并作为SWF的主要类。读取SWF时,这个文档类的构造函数会被自动调用。它就成为了你程序的入口,任何你想要做的事都可以写在上面,如:创建影片剪辑,画图,读取资源等等。如果在Flash CS4 IDE 中写代码,也可使用文档类。你也可以选择继续在时间轴上写代码。但如果使用 Flex Builder 2 或 免费Flex SDK,那里是没有时间轴的,唯一的办法就是写在类中。在这些工作中,一切都围绕着强大的文档类而进行,没有它就没有SWF。以下是一个文档类的框架:package import flash.display.Sprite;public class Test extends Sprite public function Test() init();private function init():void / 写代码处如果你看过前面的部分,不会认为这是个新知识,只不过是把他们放在了一起而已。使用默认包,导入并继承Sprite类。构造函数只有一句,调用init方法。当然,我们可以把所有代码写在构造函数里,但我们要养成一个好习惯,就是要尽量减少构造函数中的代码,这样便于理解,所以我把它写到了另一个方法中。在影片编译执行时,就会调用init中的代码。下面我们要开始学习如何用代码方式显示物体。显示列表display list在AS3中,这些不同的对象现在都被统一规化在一个地方。你所看到的舞台上的任何对象都由DisplayObject类的扩展所创建的。换种角度讲,所有的对象都是一个大家庭的一部分,他们都有着相同的基本行为,根据这点你可以知道怎样创建他们,把他们放在舞台上,销毁他们,并在舞台上操作他们。 现在创建一个精灵(sprite),一个影片剪辑,或一个文本域的方法非常的相似。实际上,所有的显示(display)对象现

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论