从零开始FlashCS3基础培训教程第十二章面向对象编程【教学目标】•面向对象编程的基本概念•类的定义•访问类和对象•使用脚本生成实例12.1功能讲解12.1.1OOP的基本概念•若将将计算机程序比作一个房子。当使用面向过程编程时,这栋房子就是一个单元。如果你想为房子换个门窗,就必须替换整个单元,重新建造一栋房屋。如果使用OOP技术,就可以在建造时将房屋设计成一个个独立的模块(对象)。如果需要换玻璃,只需要选择门窗,调换玻璃就可以;如果需要改变风格,只需要重新调整房屋的颜色和布局就可以。这就是OOP编程的优势。•事实上,在前面讲到的元件,就是一个对象。例如,定义了一个影片剪辑元件(假设它是一幅矩形的图画),并且已将它的一个副本放在了舞台上。从严格意义上来说,该影片剪辑元件也是ActionScript中的一个对象,即MovieClip类的一个实例。12.1功能讲解12.1.1OOP的基本概念1、对象对象是OOP应用程序的一个重要组成部件。这个组成部件封装了部分应用程序,这部分应用程序可以是几个过程、数据或更抽象的实体。在前面的学习中已经多次用到了对象的概念,舞台中的每个实体都可以被看作是一个对象。2、类类是一种用户定义的数据类型,它有自己的说明(属性)和操作(方法),类中含有内部数据和过程,或函数形式的对象方法,通常用来描述一些非常相似的对象所具有的共同特征和行为。任何类都可以包含三种类型的特性:属性、方法、事件。这些元素共同用于管理程序使用的数据块,并用于确定执行哪些动作以及动作的执行顺序。12.1功能讲解12.1.1OOP的基本概念类由封装在一起的数据和方法构成。封装是指对类中数据的访问会受到一定限制,要通过一定的方法才能访问数据。从外部来看,类就像一个部分可见的黑匣子。可见部分称为接口,通过这个接口可以访问类中不可见的数据部分。其优点是可以减少因直接访问数据而造成的错误。一个类定义了可区分一系列对象的所有属性,在使用时,需要将该类实例化。例如,“Sound”类泛指动画中所有的声音类型,如果要讨论对某一个声音的控制,就是将“Sound”类实例化。“类”仅仅是数据类型的定义,就像用于该数据类型的所有对象的模板,例如“所有Example数据类型的变量都拥有这些特性:A、B和C”。而“对象”仅仅是类的一个实际的实例;可将一个数据类型为MovieClip的变量描述为一个MovieClip对象。下面几条陈述虽然表达的方式不同,但意思是相同的:•变量myVariable的数据类型是Number。•变量myVariable是一个Number实例。•变量myVariable是一个Number对象。•变量myVariable是Number类的一个实例。12.1.2类的定义与访问1、类体类体放在大括号内,用于定义类的变量、常量和方法。下面的示例显示AdobeFlashPlayerAPI中Accessibility类的声明:publicfinalclassAccessibility{publicstaticfunctiongetactive():Boolean;publicstaticfunctionupdateProperties():void;}12.1.2类的定义与访问2、类属性(property)的属性(attribute)ActionScript3.0提供了几个特殊的属性(attribute)来控制对在类中定义的属性(property)的访问。•public:对所有位置的引用可见。•private:对同一类中的引用可见。•protected:对同一类及派生类中的引用可见。•internal(默认):对同一包中的引用可见。•static属性12.1.2类的定义与访问(1)静态变量静态变量是使用static关键字和var或const语句共同声明的。静态变量附加到类而不是类的实例,对于存储和共享应用于对象的整个类的信息非常有用。例如,当要保存类实例化的总次数或者要存储允许的最大类实例数,使用静态变量比较合适。下面的示例创建一个totalCount变量(用于跟踪类实例化数)和一个MAX_NUM常量(用于存储最大实例化数)。totalCount和MAX_NUM这两个变量是静态变量,因为它们包含的值应用于整个类,而不是某个特定实例。classStaticVars{publicstaticvartotalCount:int=0;publicstaticconstMAX_NUM:uint=16;}3、类中的变量12.1.2类的定义与访问(2)实例变量实例变量包括使用var和const关键字但未使用static关键字声明的属性。实例变量附加到类实例而不是整个类,对于存储特定于实例的值很有用。例如,Array类有一个名为length的实例属性,用来存储Array类的特定实例保存的数组元素的个数。12.1.2类的定义与访问4、方法方法是类定义中的函数。创建类的一个实例后,该实例就会捆绑一个方法。与在类外部声明的函数不同,不能将方法与附加方法的实例分开使用。方法是使用function关键字定义的,可以用以下两种方式。•使用函数语句:publicfunctionsampleFunction():String{}•使用分配了函数表达式的变量:publicvarsampleFunction:Function=function(){}由于函数语句更为简洁易读,所以在一般情况下,大都使用函数语句而不是函数表达式。12.2范例解析12.2.1闪烁的标志一个闪烁的红色标志,突出画面上的“点燃”二字。闪烁的时间间隔是0.2秒。作品:飞翔的小鸟标志闪烁2秒钟后,画面变换为一幅燃烧的火柴图像12.3.1图形绘制的基本概念12.3综合案例1——绘制图形•moveTo()方法•lineTo()方法•lineStyle()方法•beginFill()方法•endFill()方法•drawCircle()方法作品:图形淡化动画起始时,在网格背景下的舞台上,有一个红色的圆形;用鼠标单击该图形,则图形开始随机运动,色彩也开始淡化;当完全透明后,又开始逐渐恢复色彩;如此循环不断。12.4综合案例2——脚本文件1、将代码存储在Flash时间轴中的帧中通过将ActionScript代码放在帧中,可以方便地向使用Flash创作工具构建的应用程序添加行为。可以将代码添加到主时间轴中的任何帧,或任何MovieClip元件的时间轴中的任何帧。但是,这种灵活性也有一定的代价。构建较大的应用程序时,这会容易导致无法跟踪哪些帧包含哪些脚本。这会使得随着时间的过去,应用程序越来越难以维护。许多开发人员将代码仅仅放在时间轴的第1帧中,或放在Flash文档中的特定图层上,以简化在Flash创作工具中组织其ActionScript代码的工作。这样,就可以容易地在FlashFLA文件中查找和维护代码。但是,要在另一个Flash项目中使用相同的代码,就必须将代码复制并粘贴到新文件中。12.4.1导入外部ActionScript文件12.4综合案例2——脚本文件12.4.1导入外部ActionScript文件2、将代码存储在ActionScript文件中如果动画项目中包括重要的ActionScript代码,则最好在单独的ActionScript源文件(扩展名为.as的文本文件)中组织这些代码。可以采用以下两种方式之一来设置ActionScript文件的结构,具体取决于用户打算如何在应用程序中使用该文件。(1)非结构化ActionScript代码(2)ActionScript类定义:定义一个ActionScript类,包含它的方法和属性。作品:将动画脚本保存在外部文件12.5小结ActionScript是由FlashPlayer中的ActionScript虚拟机(AVM)来执行的。ActionScript代码通常被编译器编译成“字节码格式”(一种由计算机编写且能够为计算机所理解的编程语言)。字节码嵌入SWF文件中,SWF文件由运行时环境FlashPlayer执行。正是ActionScript的出色表现,才使得Flash动画作品实现了交互性、数据处理以及其它许多功能。这是目前其他动画作品所望尘莫及的。本章仅是初步讲解了面向对象编程的基本概念和初级用法,目的是让读者对这种编程思想有一个初步的认识。ActionScript3.0具有更加全面、强大的功能,但是其更加复杂的编程技术也使很多用户望而生畏,毕竟大多数动画爱好者不是计算机出身的程序高手。也许正是考虑到这种情况,FlashCS3允许用户使用ActionScript2.0来编程。对于普通用户来说,ActionScript2.0的功能已经完全能够满足应用的需要了。