1、第6章面向对象的编程,本章要点 6.1 “小球随机碰撞方形边框”动画 6.2 “猜字母游戏”动画 6.3 “指针钟”动画 6.4 “MP3播放器”动画 习题6,6.1 “小球随机碰撞方形边框”动画,6.1.1 什么是面向对象的编程 1什么是面向对象的编程 在20世纪80年代提出了面向对象的程序设计(Object Oriented Programming,OOP),它能够有效地改进结构化程序设计中存在的问题。它采用面向对象的方法来解决问题,不再将问题分解为过程,而是将问题分解为对象。在结构化的程序设计中,要解决某一个问题,是将问题进行分解,然后用许多功能不同的函数来实现,数据与函数是分离的。面向
2、对象的程序设计方法的思考方式是面向问题结构的,它认为现实世界是由对象组成的,要解决某个问题,必须要首先确定这个问题是由哪些对象组成的。 对象是现实世界中可以独立存在的、可以被区分的一个实体(也可以是一些概念上的实体),它有自己的属性、作用于对象的操作(即作用于对象的方法)和对象响应的动作(即事件)。对象之间的相互作用通过消息传送来实现。因此面向对象编程的设计模式为“对象+消息”。 在面向对象的编程中,有几个很重要的基本概念:类、对象、属性、方法、实例和继承等。“类”可以打一个比喻,月饼模子可以看成是一个“类”,扣出的月饼是对象,每个月饼都继承了模子(类)的属性。比如模子的形状是菱形,那扣出来的
3、月饼就是菱形。每个月饼还具有它自己的特有属性,例如,某个月饼的馅有蛋黄,某个月饼的馅有枣泥。通过一些方法可以改变这些属性,例如把月饼切成四份等。,6.1 “小球随机碰撞方形边框”动画,在面向对象的编程中,对象拥有它的属性和方法。属性就是一些有特殊用途的变量,方法实际上就是函数,是为了完成对对象属性进行操作的函数,通过函数改变变量的值,就是改变了对象的属性。对象是类的实例,程序是由对象组成的。面向对象的程序设计是将问题抽象成许多类,将对象属性和方法封装成一个整体,供程序设计者使用。 Flash元件库中的元件就是“类”,由元件在舞台工作区内产生的影片剪辑实例,通过实例的“属性”面板为一个影片剪辑实
4、例起一个名字,这个过程就是做一次new操作,将一个元件对象(类)实例化,产生对象。 2创建对象 可以使用new操作符通过Flash内置对象类来创建一个对象。“myDate = new date();”这条语句就是使用了Flash MX 2004的日期内置类创建了一个新对象(也叫实例化)。这里,对象myDate可以使用内置对象date()的getDate()等方法和属性。 使用new 操作符来创建一个对象需要使用构造函数(构造函数是一种简单的函数,它用来创建某一类型的对象)。Actionscript 的内置对象也是一种提前写好的构造函数。,6.1 “小球随机碰撞方形边框”动画,3访问对象 可以使
5、用点操作符来访问对象的属性,在点操作符的左边写入对象名,点操作符右边写入要使用的对象。例如下面程序中,Sound1是对象,setVolume()是方法,通过点操作符来连接。 Sound1=new sound(this);/实例化一个声音对象Sound1 Sound1.setVolume(60);/设置声音对象Sound1的音量为60 4实例分析 (1)在第1帧舞台工作区中创建一个绿色圆形的影片剪辑实例,实例名称为“BALL”。 (2)使用Flash MX 2004的内置类Color来实例化一个myball实例。 (3)在第1帧舞台工作区中放置一个名称为“AN1”的按钮实例,在第1帧的“动作-帧
6、”面板内加入如下程序。注意:“setRGB(0x0000ff)”中的setRGB是内置类Color的一个方法。其中的x是英文小写字母,“0”为数字零,程序中的英文大小写不可以改变。 AN1.onRelease=function()myball=new Color(BALL);/用new命令定义了一个实例myballmyball.setRGB(0x0000FF);/ 其中“0x0000FF”是16进制数,表示设置蓝色 /通过myball的setRGB方法改变了myball的颜色属性,6.1 “小球随机碰撞方形边框”动画,(4)单击“控制”“测试影片”菜单命令,单击按钮,舞台工作区中的圆形图形即可
7、从绿色变成了蓝色。圆形图形实例的颜色属性通过实例的setRGB方法,从绿色变成了蓝色。 6.1.2 数学和字符串对象 1数学(Math)对象 数学对象也不需要实例化。数学(Math)对象的常用方法在“动作”面板内命令列表区中的“内置类”“核心”“Math”目录下。常用方法的格式和功能如表6-1-1所示。 2字符串(String)对象 在使用string之前,必须将string对象实例化,然后使用字符串的对象实例进行字符串的连接、分隔和大小写转换。 (1)将string对象实例化的格式:myString=new String(“); 例如,下面这两种方法均有效。 S1=new String(“A
8、BCDEFG“); S2=“ABCDEFG“;,6.1 “小球随机碰撞方形边框”动画,(2)string对象的属性就有一个,简介如下。 length:返回字符串的长度。例如,在舞台工作区内创建一个动态文本框,它的变量名字为LN,在“图层1”图层第1帧内加入如下脚本程序,运行程序后,文本框内会显示26。 S1=new String(“ABCDEFGHIJKLMNOPQRSTUVWXYZ“); LN=S1.length (3)string对象的方法有12个,下面介绍其中的3个。 string.charAt方法 :返回指定索引数字指示的字符。字符的数目从0到字符串长度减1。例如,在舞台工作区内创建一
9、个动态文本框,它的变量名字为LN,在“图层1”图层第1帧内加入如下脚本程序,运行程序后,文本框内会显示字母D。 S1=new String(“ABCDEFGHIJKLMNOPQRSTUVWXYZ“); LN=S1.charAt(3) /将返回字母D string.Concat方法:将两个字符串组合成一个新的字符串。例如,在舞台工作区内创建一个动态文本框,它的变量名字为LN,在“图层1”图层第1帧内加入如下脚本程序,运行程序后,文本框内会显示字母“ABC123DEF456”。 myString=“ABC123“;,6.1 “小球随机碰撞方形边框”动画,LN=myString.concat(“DE
10、F456“);/将返回一个“ABC123DEF456”字符串 substr(start,length)方法:从字符串的start开始,截取长为length的子字符串。字符的数目从0到字符串长度减1。例如,在舞台工作区内创建一个动态文本框,它的变量名字为LN,在“图层1”图层第1帧内加入如下脚本程序,运行程序后,文本框内会显示字母“CDEFGHIJKL”。 S1=new String(“ABCDEFGHIJKLMNOPQRSTUVWXYZ“); LN=S1.substr(2,10);,6.2 “猜字母游戏”动画,如果要使用内置对象,可以从指令选择区中的“Objects”(对象)目录中寻找,然后将
11、要使用的对象拖曳到程序编辑区中使用。 6.2.1 数组和颜色对象 1数组(Array)对象 数组对象是一种很常用的Flash Actionscript内置对象,在数组元素“”和“”之间的名称叫做“索引”(index),数组通常用来储存同一类的数据。数组对象可以从“动作”面板命令列表区的“内置类”“核心”目录中找到。 (1)指定要使用对象属性的元素。例如move1=“a“; ,move2=“b“; ,move3=“c“; 等。 (2)使用new Array( )创建一个数组对象并赋值。举例如下。 myArray=new Array(); myArray0=1; myArray1=2; myArr
12、ay2=3; (3)数组对象的方法:数组对象的方法有12个,下面简要介绍其中几个。 格式:concat(array1,arrayN); 功能:用来连接array1到arrayN数组的值。,6.2 “猜字母游戏”动画, 格式:my_array.join(separator); 功能:返回数组中的数组元素,这些数组元素用separator 作为分隔符分割。如果省略此参数,则使用逗号作为默认分隔符。举例如下。 N1_array = new Array(“One“,“Two“,“Three“,“Four“,“Five“) trace(N1_array.join(); / 返回One,Two,Three
13、,Four,Five trace(N1_array.join(“ * “); / 返回One*Two*Three*Four*Five trace(N1_array.join(“ + “); / 返回One+Two+Three+Four+Five 格式:my_array.pop() 功能:返回数组中最后一个数组元素的值,同时删除数组中最后一个数组元素。举例如下。 N1_array = new Array(“One“,“Two“,“Three“,“Four“,“Five“) SN1 = N1_array.pop(); trace(SN1);/ 返回Five SN1 = N1_array.pop()
14、; trace(SN1);/ 返回Four 格式:my_array.push(value,.),6.2 “猜字母游戏”动画,功能:将一个或多个数组元素添加到数组的结尾,并返回该数组的新长度。value参数是要追加到数组中的一个或多个数组元素值。举例如下。 N1_array = new Array(“One“,“Two“,“Three“,“Four“,“Five“) SN1= N1_array.push(“Six“, “Seven“); trace(SN1);/返回值为7 格式:my_array.reverse() 功能:将数组中的数组元素倒转。举例如下。 N1_array = new Arra
15、y(“One“,“Two“,“Three“,“Four“,“Five“) trace(N1_array.join(); /返回值为Five,Four,Three,Two,One (4)数组对象的属性:数组对象的属性只有同一个,即length属性。length属性可以返回数组的长度。举例如下。 my_array = new Array(); trace(my_array.length); / 初始长度为 0 my_array0 = A; trace(my_array.length); / 将 my_array.length 更新为 1 my_array2 = AB; trace(my_array
16、.length); / 将 my_array.length 更新为 3 my_array8 = ABC;,6.2 “猜字母游戏”动画,trace(my_array.length); / 将 my_array.length 更新为 9 2颜色(Color)对象 通过new Color()来实例化一个颜色对象。例如,在舞台中创建了一个红色方块的影片剪辑实例,并命名为“S1”。然后使用“myColor=new Color(S1);”语句实例化一个myColor对象实例,通过这个实例的一些属性可以得到Sample影片剪辑实例中红色方块的颜色值。颜色对象可以从“动作”面板命令列表区的“内置类”“影片”目
17、录中找到。 (1)格式:myColor=new Color(); (2)Color对象常用的方法介绍如下。 格式:getRGB(); 功能:获得对象的颜色值。 格式:setRGB(0xRRGGBB); 功能:通过括号中的16进制数来设置对象的颜色。RR,GG和BB取值在00到ff之间。 6.2.2 键盘和鼠标对象 1键盘(Key)对象 键盘对象是一种比较特殊的对象,不需要实例化就可以使用它的方法和属性。键盘对象可以从“动作”面板命令列表区的“内置类”“影片”目录中找到。,6.2 “猜字母游戏”动画,(1)key对象的常用方法介绍如下。 key.getAscII():返回最近一次按键的AscII
18、码。 key.getCode():返回最近一个按键的VirtualKey 码。 key.isDown():当键盘上的任意键按下的时候,返回true逻辑值。 key.isToggled():当小键盘加了字母锁时返回true。 (2)key对象的常用属性:key对象的常用属性如表6-2-1所示。 2鼠标(Mouse)对象 鼠标对象不需要实例化。可以从“动作”面板命令列表区的“内置类”“核心”目录中找到。它有4个方法,其中的两个介绍如下。 (1)鼠标隐藏:mouse.hide()。 (2)鼠标显示:mouse.show()。,6.3 “指针钟”动画,6.3.1 时间(Date)对象 时间对象是将计算
19、机系统的时间填入到对象实例中去。 (1)时间对象实例化的格式:myDate=new date(); (2)时间对象的常用方法如图6-3-1所示。,6.4 “MP3播放器”动画,6.4.1 声音(Sound)对象 1声音(Sound)对象的构造函数 格式:new Sound(target); 其中的参数target是Sound对象操作的影片剪辑实例。此参数是可选的。可采用“mySound=new Sound();”或“mySound=new Sound(target); ”命令。 功能:使用new操作符实例化sound对象,即为指定的影片剪辑创建新的Sound对象。如果没有指定目标实例targe
20、t(目标),则Sound对象控制影片中的所有声音。如果指定target,则只对指定的对象起作用。 例1 下面的实例创建了一个名字为globalsound的sound对象新实例。程序中的第二行调用setVolume方法并将影片中的所有声音的音量调整为50%。 globalsound = new Sound(); globalsound.setVolume(50); 例2 下面的实例创建Sound对象的新实例,将目标影片剪辑myMovie传递给它,然后调用start方法播放myMovie中的所有声音。 moviesound = new Sound(myMovie); moviesound.star
21、t();,6.4 “MP3播放器”动画,2声音对象的方法 (1)mySound.attachSound方法 格式:ySound.attachSound(“dName”);图6-4-1 “链接属性”对话框 功能:这个方法是绑定一个在“库”面板中的声音对象,绑定后就可以用声音的其他方法来控制声音的各个属性了。其中,“idName”是指库中声音元件的标识符(即id)名称,它是在“链接属性”对话框“标识符”文本框中输入的,不是声音元件名字。 在“库”面板中的声音元件上,单击鼠标右键,调出快捷菜单,单击“连接”菜单命令,可调出如图6-4-1所示的“链接属性”对话框。在“标识符”文本框内输入元件的标识符名
22、称,再选择复选框,需要的话还应该在“URL”文本框内输入URL数据,单击“确定”按钮退出。,图6-4-1 “链接属性”对话框,6.4 “MP3播放器”动画,(2)Sound.getBytesLoaded方法 格式:Sound.getBytesLoaded(); 功能:返回指示所加载字节数的整数。返回为指定Sound对象加载(进入流)的字节数。可以比较getBytesLoaded的值与getBytesTotal的值,以确定已加载声音的百分比。 (3)Sound.getBytesTotal方法 格式:Sound.getBytesTotal(); 功能:返回一个整数,以字节为单位指示指定Sound对
23、象的总大小。 (4)mySound.getPan方法 格式:mySound.getPan(); 功能:这个方法返回在上一次setPan调用中设置的面板级别,是一个从100到100之间的整值,这个值代表左右声道的音量,100到0是左声道的值,0到100是右声道的值(0平衡地设置左右声道)。该面板设置控制影片中当前和将来声音的左右均衡。 此方法是用setVolume或setTransform方法累积的。,6.4 “MP3播放器”动画,(5)mySound.getTransform方法 格式:mySound.getTransform(); 功能:返回声音变化的属性值,其中属性有ll(控制左声道进入左
24、扬声器的音量)、lr(控制右声道进入左扬声器的音量)、rr(控制右声道进入右扬声器的音量)和rl(控制左声道进入右扬声器的音量)。它们的取值为100到100。 通过下面的公式可以计算左右音量的大小:左输出=左输入*ll+右输入*lr,右输出=右输入*rr+左输入*rl。如果不指定这几个属性,系统默认为:ll=100,lr=0,rr=100,rl=0。 (6)sound.getVolume方法 格式:sound.getVolume(); 功能:返回一个0到100之间的整数,0到100指定了当前声音对象的音量,0是无音量,100是最高音量。可以将sound.getVolume()的值赋给一个变量。
25、它的默认值是100。 (7)mySound.loadSound方法 格式:mySound.loadSound(“url“, isStreaming); 其中,urlMP3声音文件在服务器上的位置。isStreaming一个布尔值,指示声音是声音流还是事件声音。,6.4 “MP3播放器”动画,功能:将MP3文件加载到Sound对象的实例。可以使用isSteaming参数指示该声音是一个事件声音还是一个声音流。 事件声音在完全加载后才能播放。它们由动作脚本Sound对象进行管理,而且响应此对象的所有方法和属性。声音流在下载的同时播放。当接收的数据足以启动解压缩程序时,播放开始。与事件声音一样,声音
26、流仅存在于虚拟内存中,不能将其下载到硬盘。例如:下面的实例加载事件声音。 s.loadSound( “http:/serverpath:port/mp3filename“, false); 例如,下面的示例加载声音流。 loadSound( “http:/serverpath:port/mp3filename“, true); (8)mySound.setPan方法 格式:mySound.setPan(pan); 其中,参数pan一个整数,它指定声音的左右均衡。有效值的范围为100到100,其中100表示仅使用左声道,100表示仅使用右声道,而0表示在两个声道间平均地均衡声音。 功能:用来确定
27、声音在左右声道(扬声器)中是如何播放的。对于单声道声音,pan确定声音通过哪个扬声器(左或右)进行播放。例如:下面的实例创建Sound对象实例S,并附加一个来自库的标识符为L7的声音。它还调用setVolume和setPan方法来控制L7声音。,6.4 “MP3播放器”动画,onClipEvent(mouseDown) S= new Sound(this); /创建一个声音对象S S.attachSound(“L7“); S.setVolume(50); S.setPan(-100); S.start(30, 5); (9)mySound.setTransform方法 格式:mySound.s
28、etTransform(soundTransformObject); 其中,参数soundTransformObject一个用通用Object对象的构造函数创建的对象。 功能:用来设置声音对象的属性,其中sxform是一个使用对象创建的对象名称。通过对象创建一个声音对象模型,然后通过这个模型设置mySound对象的4个属性。举例如下。 mySound.attachSound(“thisSong“);/利用attachSound方法绑定一个声音,绑定声音的过程见attachSound方法介绍 myTransformObject=new Object();/构造一个声音变化对象myTransfor
29、mObject,6.4 “MP3播放器”动画,myTransformObject.ll=50; myTransformObject.lr=50; myTransformObject.rr=50; myTransformObject.rl=50; /将立体声音的左右输入平均分配给扬声器,形成单声道 mySound.setTransform(myTransformObject); /将声音变化对象myTransformObject传递给setTransform方法 (10)setVolume方法 格式:sound.setVolume(n); 功能:用来设置当前声音对象音量的大小。其中参数n可以是一
30、个整数值或一个变量,其值为0到100之间的整数,0为无声,100是最大音量。 (11)start方法 格式:sound.start(); 功能:开始当前声音对象的播放。 (12)stop方法 格式:sound.stop(); 功能:停止当前声音对象的播出。,6.4 “MP3播放器”动画,3声音对象的属性 (1)duration属性 格式:mySound.duration; 功能:它是只读属性。给出声音的持续时间,以毫秒为单位。 (2)position属性 格式:mySound.position; 功能:它是只读属性。给出声音已播放的毫秒数。如果声音是循环的,则在每次循环开始时,位置将被重置为0
31、。 4声音对象的事件 (1)格式:mySoundObject.onLoad = callbackFunction; 其中,mySoundObject一个Sound对象。callbackFunction一个函数,它是事件处理函数。 功能:必须创建一个在调用onLoad事件时执行的事件处理函数。既可以使用匿名函数,也可以使用命名函数。当加载声音时自动调用事件处理函数。 (2)格式:mySoundObject.onSoundComplete = callbackFunction 其中,mySoundObject一个Sound对象。callbackFunction一个函数,它是事件处理函数。,6.4
32、“MP3播放器”动画,功能:必须创建在调用onSoundComplete事件时执行的函数。既可以使用匿名函数也可以使用命名函数。当声音播放完时自动调用事件处理函数。可以使用onSoundComplete事件根据声音的完成来触发影片中的事件。例如,用匿名函数。 s = new Sound(); s.attachSound(“mySound“); s.onSoundComplete = function() trace(“mySound completed“); ; s.start(); 例如,使用命名函数。 function callback1() trace(“mySound completed“); ,