1、AS3.0从入门到精通 AS3.0程序设计 1. 逻辑运算 1.1. 程序设计中需进行逻辑运算(布尔运算) 2. 程序的3种结构 2.1. 顺序结构 条件 真 假 2.2. 选择结构 1.2. 1.3. 1.4. 2.3. 循环结构 条件 1.5. 3. 选择程序结构 3.1. if…else 条件语句 if(表达式){ 语句1 } else { 语句2 } 3.2. if…else if..else语句 if(表达式1){ 语句1 } else if(表达式2){ 语句2 } else if(表达式3){ 语句3
2、 } …. else if (表达式n){ 语句n } else{ 语句m } 3.3. switch语句 switch (表达式) { case 1 : 程序语句1; break; case 2 : 程序语句2; break; break; case 3 : 程序语句3; break; default : 默认执行程序语句; } ² 表达式:结果是一个值 case: case表达式与switch的表达式参数匹配,执行该语句 ² break:执行相应语句后,跳出switch ² default:
3、case表达式与switch表达式不匹配时,执行这该语句 4. 循环程序结构 由循环体和控制条件两部分组成,2种类型,一种是先判断条件,再执行语句,另一种是先执行语句,再判断条件 4.1. for循环语句 for(初始化;循环条件;步进语句){ 循环执行语句 } ² 初始化:对变量初始化 ² 循环条件:逻辑表达式,如结果为false退出循环,否则继续执行语句 ² 步进语句:改变变量的值 4.2. while循环语句 while (循环条件) { 循环执行语句; } ² 循环条件:逻辑表达式,若为true,继续执行代码,否则退出循环 4.3. do…whi
4、le语句 do{ 循环执行语句; } while (循环条件); ² 先执行语句,后判断条件 4.4. for..in 和for each..in语句 1.6. 4.5. 循环嵌套 for(初始化;循环条件;步进语句){ (初始化;循环条件;步进语句){ 循环执行语句 } } 4.6. 循环流程控制语句 使用break和continue控制循环流程 break:直接跳出循环,不再执行后面的语句 continue:停止当前这一轮循环,直接跳到下一轮循环,当前contunue中后面的语句不再执行。 避免杂乱代码;重复利用,提高效率 函数 1.
5、 定义函数 1.1. 函数语句定义法 function 函数名(参数1:参数类型,参数2:参数类型...):返回类型{ //函数体 } 1.2. 函数表达式定义法 也称函数字面值或匿名函数,在早期版本广泛使用 var 函数名:function=function (参数1:参数类型,参数2:参数类型...):返回类型{ //函数体 } 1.3. 两种定义方法的区别和选择 1.3.1. 区别 Ø 作用域不同 函数语句定义法可在定义前或定义后进行调用 函数表达式定义法只能在定义后调用 Ø this关键字指向不同 函数语句定义法-当前函数作用域 函数表达式定义法t
6、his指向随依附对象的不同而不同 1.3.2. 选择 一般使用函数语句定义法 2. 调用函数 2.1. 一般调用 无参函数 function HelloAS() { trace("欢迎走进AS3.0世界"); } HelloAS(); 有参函数,参数有默认值,调用时不输入参数 function HelloAS(str:String="AS3.0世界欢迎你!") { trace(str); } HelloAS(); 有参函数,参数无默认值,调用时必须输入参数,且参数类型一致 function HelloAS(str:String) { trace(str)
7、 } HelloAS("AS3.0世界欢迎你!"); 如没指定参数的类型,输入参数类型没强制要求 也可将函数赋值给变量,使用变量名调用函数 function 求和(a:int,b:int){ trace(a+b) } var sum:function=求和 sum(1,2) 2.2. 嵌套和递归调用函数 2.2.1. 嵌套调用函数 用一个函数调用另一函数,即在一个函数体内定义另一函数 function sum(a:String,b:Number) { function STI(c:String):int { return int(c); } fu
8、nction NTR(d:Number):int { return Math.round(d); } return STI(a) + NTR(b); } var a:String="10"; var b:Number=5.56; trace(sum(a,b)); 嵌套函数可以调用与自身函数并列的函数 function sum(a:String,b:Number) { return STI(a) + NTR(b); } var a:String="10"; var b:Number=5.56; trace(sum(a,b)); function STI(c
9、String):int { return int(c); } function NTR(d:Number):int { return Math.round(d); } 2.2.2. 递归调用函数 递归调用函数是函数调用自身函数,递归调用必须有一递归结束条件(递归出口),否则形成死循环。 function sum(n:int):int { if (n==1) { return 1; } else { return n + sum(n - 1); } } trace(sum(1000)); 3. 函数返回值 3.1. return 语句 3.
10、2. return 语句 return 返回值; 返回值可以是数值、字符串、对象(数组、影片剪辑等) function 圆面积(r:Number):Number { var s:Number=Math.PI*r*r; return s; } trace(圆面积(5)); 返回值也可以是表达式 function 圆面积(r:Number):Number { return Math.PI * r * r; } trace(圆面积(5)); 可以有多个语句,函数执行了语句后,就跳出函数体 function 选择输入(x:Number):Number {
11、if (x>0) { return 1; } else if (x<0) { return -1; } else { return 0; } } trace(选择输入(10)); 语句的返回值可以是空“undefined” function 输出测试() { return; } trace(输出测试()); 3.3. 返回值类型 返回值类型在函数定义中是可选参数,如未定义,返回值类型由return语句返回值的数据类型来定。 function 测试类型() { var a:String="这是一个字符串"; return a; }
12、trace(typeof(测试类型())); 如定义了返回值类型,返回的类型必须与定义类型相同 如函数不需要返回值,也就不存在return语句,定义函数也不能设置返回类型。 function 返回测试():String { var a:String="这是一个字符串"; } trace(返回测试()); 4. 函数参数 1.1. 传递参数的语法 参数位于函数格式的括号中 (参数1:参数类型=默认值,参数2:参数类型=默认值) 函数支持传递多个参数,定义参数时,使用半角逗号分开不同的参数 function intro(username:String,age:int)
13、void { trace("你的姓名:"+username+" 年龄是:"+age); } intro("小王",25); 4.1. 传递参数的两种方法 所有参数按引用传递 function test(a:Number):Number { a++; return a; } var b:Number=5; trace("b引用前",+b); var c=test(b); trace("b引用后",+b); trace("c: "+c); 复杂类型按引用传递,且保持这个引用 function testArr(_arr:Array):void {
14、var a:int=100; _arr.push(a); } var b:Array=[1,2,3]; trace("引用前:"+b); testArr(b); trace("引用后"+b); 2. 4.2. 给函数设置默认参数 AS3.0可给函数设置默认参数,默认参数是可选项 设置了默认参数,调用函数时如没写参数,将使用函数的默认参数 没有默认值的参数必须输入 function Test(a:int,b:int=2,c:int=3){ trace(a,b,c) } Test(1) Test(1,4) Test(1,4,0) 4.3. argumnets
15、对象和(rest)参数
AS3.0调用函数时检查参数数量的方法
4.3.1. arguments对象
函数中可使用对象访问有关传递给函数的参数信息,
auguments对象是一个数组,arguments.length属性记录参数数量
function TestArg(a:int,b:int,c:int):void {
trace("输入的参数个数是:"+arguments.length);
for (var i:uint=0; i 16、1,2,3)
arguments.callee属性通常用在匿名函数中创建递归。
function fac(i:int) {
if (i==1) {
return 1;
} else {
return i + arguments.callee(i - 1);
}
}
trace(fac(100));
4.3.2. …(rest)参数
…rest参数可指定自己命名的数组来接受任意多个以逗号分隔的参数
语法格式
function(...args)
function(参数1,参数2,...args)
…(rest)参数不具有callee属性
fu 17、nction TestArg(...args):void {
trace("输入的参数个数是:"+args.length);
for (var i:int=0; i 18、nt=0; i 19、及与swf进行的交互操作。
事件用事件对象表示,事件对象是Event(事件)类或Event类子类的实例。
事件侦听器是用户编写的用于响应事件的函数或方法,并添加到事件目标/显示对象列表。
function 事件侦听函数(事件对象:事件类型):void {
//为响应事件面执行的动作
}
事件目标.addEventListener(事件对象的事件名称,事件侦听函数);
创建事件侦听器格式说明
Ø 事件侦听函数:响应事件要执行的动作或方法
Ø 事件对象:事件对象指定的类名称
Ø 事件目标:被侦听的电影票对象名称
Ø 事件对象的事件名称:事件常量
1.1.3. AS3.0中 20、事件处理任务
Ø 编写代码以响应事件
Ø 阻止代码响应事件
Ø 处理事件对象
Ø 处理事件流
Ø 从类中调度事件
Ø 创建自定义事件类型
1.2. 早期AS版本中的事件处理
1.2.1. AS1.0
使用on()或onClipEvent()两个事件处理函数处理事件
1.2.2. AS2.0
事件处理机制包括
回调函数事件:onLoad, oninit, onComplete等
事件侦听器:addListener()、addEventListener()
但this关键词指向不明确
1.2.3. AS3.0
只有一种事件处理模式
只能使用addEventList 21、ener()注册侦听器
可以对属于事件流部分的任何对象调用addEventListener()方法
只有函数或方法可以是事件侦听器
2. Event类
Event类是所有事件的基类,所发生的事件必须是Event类或其子类的实例
2.1. 了解Event类的属性
2.1.1. type属性
Event.type表示事件对象的事件类型,
2.1.2. cancelable属性
事件的默认行为是否可以阻止由布尔值表示
是一个布尔值,默认为false
和preventDefault()方法结合在一起使用
2.1.3. target属性
存储对事件目标的引用
var sp:S 22、prite=new Sprite();
sp.graphics.beginFill(0xff0000);
sp.graphics.drawCircle(100,100,40);
sp.graphics.endFill();
addChild(sp);
function TestTar(event:MouseEvent):void {
event.target.x=300;
event.target.y=100;
}
sp.addEventListener(MouseEvent.CLICK,TestTar);
2.1.4. 其他属性
currentTarget、even 23、tphase、bubbles属性与事件流机制有关。
Event类还有26个静态字符串常量,定义26种事件类型,如ADDED, REMOVED, UNLOAD
2.2. 了解Event类的方法
Ø Event.clone():赋值Event子类实例,返回Event对象原始实例的副本
Ø Event.toString():返回一个Event对象所有属性的字符串
Ø Event.stopPropogation():阻止事件对象移动到下一节点
Ø Event.stopImmediatePropogation():阻止事件对象移动到下一节点,不执行当前节点其他事件侦听器
Ø Event.p 24、reventDefault():和属性结合使用,取消事件的默认行为的发生器
2.3. Event类的子类
Ø MouseEvnet
Ø KeyBoardEvent
Ø TimerEvent
Ø TextEvent
每个子类事件类型常量,添加新的属性
自定义事件类
3. 事件侦听器
创建方法:先创建事件侦听函数,再在事件目标上注册侦听器函数
3.1. 创建事件侦听器
事件侦听器格式为函数,可以是自定义函数,也可以是实例的一个方法
格式
function 侦听器名称(evt:事件类型):void {...}
Ø 侦听器名称:命名符合变量命名规则
Ø evt: 事件侦听 25、器参数
Ø 事件类型Event类或子类实例
Ø void:返回值为空,不可省
var sp:Sprite=new Sprite();
sp.graphics.beginFill(0xff0000);
sp.graphics.drawCircle(100,100,40);
sp.graphics.endFill();
addChild(sp);
function Test(event:MouseEvent):void {
trace("事件侦听函数建立成功");
}
sp.addEventListener(MouseEvent.CLICK,Test);管理事件侦听器
3 26、2. 管理事件侦听器
3.2.1. 注册事件侦听器
addEventListener函数注册事件侦听器
格式
事件发送者.addEventListener(事件类型,侦听器)
Ø 事件发送者:为EventDispatcher类或子类的实例
Ø 事件类型:Event类实例或其子类的实例
Ø 侦听器:事件执行时的侦听器函数
3.2.2. 删除事件侦听器
格式
事件发送者.addEventListener(事件类型,侦听器)
删除不再使用的侦听器可节约系统资源,提高程序效率
例:
import flash.display.Sprite;
import flash.ev 27、ents.MouseEvent;
var sp:Sprite=new Sprite();
sp.graphics.beginFill(0xff0000);
sp.graphics.drawCircle(100,100,40);
sp.graphics.endFill();
addChild(sp);
function Test(evt:MouseEvent):void
{
trace("事件侦听函数建立成功");
sp.removeEventListener(MouseEvent.CLICK,Test);
}
sp.addEventListener(Mouse 28、Event.CLICK,Test);
3.2.3. 检查事件侦听器
检查事件侦听器
事件发送者.hasEventListener(事件类型)
import flash.display.Sprite;
import flash.events.MouseEvent;
var sp:Sprite=new Sprite();
sp.graphics.beginFill(0x00ff00);
sp.graphics.drawCircle(200,200,100);
sp.graphics.endFill();
addChild(sp)
function Test(evt:Mou 29、seEvent):void
{
trace("侦听器事件已建立");
sp.removeEventListener(MouseEvent.CLICK,Test);
trace(sp.hasEventListener(MouseEvent.CLICK));
}
sp.addEventListener(MouseEvent.CLICK,Test);
trace(sp.hasEventListener(MouseEvent.CLICK));
willTrigger方法能够检查显示列表对象及所有父级上的侦听器
4. 事件处理类型
所有事件位于flash.events包 30、内,构建了20多个Eevnt类的子类,来管理事件类型
4.1. 鼠标事件
MouseEvent类定义了10种的鼠标事件
Ø CLICK:单击事件
Ø DOUBLE_CLICK:双击事件
Ø MOUSE_DOWN:按下事件
Ø MOUSE_MOVE:移动事件
Ø MOUSE_OUT:移出事件
Ø MOUSE_OVER:移过事件
Ø MOUSE_UP:释放事件
Ø MOUSE_WHEEL:滚轮滚动事件
Ø ROLL_OUT:滑入事件
Ø ROLL_OVER0:滑出事件
例5-1 给显示对象添加鼠标单击事件
例5-2 给显示对象添加鼠标双击事件
//执行双击事件,必须将 31、其属性设置为ture
sp.doubleClickEnabled=true;
例5-3创建一个可以拖放的显示对象
//设置可以接受按钮事件
sp.buttonMode=true;
例5-4自定义鼠标样式
cursor.x=evt.stageX;
cursor.y=evt.stageY;
evt.updateAfterEvent();
例5-5鼠标划过时产生变色效果
function makeBlue(event:MouseEvent):void {
colorInfo.color=0x003399;
event.target.transform.colorTrans 32、form=colorInfo;
}
4.2. 键盘事件
使用KeyboardEvent类处理键盘操作事件,有两类型事件
KeyboardEvent.KEY_DOWN:按下键盘
KeyboardEvent.KEY_UP:释放键盘
4.
例5-6 判断按下和释放键盘
使用时要获得焦点,应先单击显示对象
例5-7 使用上下左右键控制运动
switch (event.keyCode) {
case Keyboard.UP :
box.y-=10;
break;
keyboard.DOWN及KeyCode
例5-8 使用Keyboard类预定义常量
87( 33、W),83(S),65(A),68(D)
4.3. 时间事件
Timer类的TimerEvent事件类
其建立的时间间隔受帧频和计算机内存大小的影响,导致运算不准确。
TimerEvent.TIMER:计时事件
TimerEvent.TIMER_COMPLETE:计时结束事件
例5-9 1分钟倒计时
4.4. 帧循环事件
帧循环事件能够控制代码随帧频播放。
例 5-10 球运动
ENTER_FRAME事件不需侦听时,要移除侦听,否则消耗资源。
面向对象编程基础
1. 概述
对象是有自己特定标识的东西,如人、汽车、植物等。有时会觉得虚无缥缈。
属性是对象共在的特点 34、如人的属性有身高、体重、年龄、性别
方法是对象要做的事情,如人的吃饭、睡觉、工作、走路等
属性和方法是对象的本质组成部分,面向对象编程即将对象的属性和方法包装成类
类有核心类和自定义类,核心类是已设计好的类。
2. 类
对象与类类似于实例与元件
类是一群对象共有的特性和行为
包括包块和类名称,构造函数,属性和方法
2.1. 创建自定义类
创建步骤
1) 保存类文件的目录
2) 创建以类名命名的AS文件
3) package 类名{}
4) import 其他类
5) class 类名{}
6) 构造函数、方法和属性
2.2. 创建类实例
1) import 35、类路径.类名称
2) var 类引用名称:类名称=new 类名称构造函数()
2.3. 包块和类
package 包块路径{}
包块路径为类的存储路径,无路径表明存储为默认目录
所有类要定义到一个包块中
public class 类名称{}
类名称第一个字母大写
2.4. 包的导入
1) import flash.display.Sprite:直接导入单个包
2) import flash.text.*导入整个包
3) 使用同一包的类文件,则不需要导入。
2.5. 构造函数
创建的目的是在创建对象时初始化对象,为对象的变量输值
类可创建构造函数,也可不创建构造函数
36、
构造函数可以有参数
1) 构造函数与类名完全相同
2) 只能使用public访问控制
3) 不能使用return语句返回值,但可控制程序流程
4) 不能声明返回类型
2.6. 声明和访问类的属性
一般在class之后声明属性
属性分实例属性和静态属性,实例属性须创建类实例后访问,静态属性可直接访问
属性的声明
1) var x:Number
2) var name:String="good"
3) public var birthday:Date
4) public var age:Number=30
应注意
1) 声明实例属性可直接输值,但不能输表达式
2) 37、实例实现只能在包内访问
3) var前可加访问控制符
a) internal:同一包中引用可见
b) private:同一类中引用可见
c) protected:同一类和派生类中引用可见
d) public:所有位置引用可见
静态属性声明
1) static var 属性名称:属性类型
2) static var 属性名称:属性类型=值
3) public static var 属性名称:属性类型
4) public static var 属性名称:属性类型=值
5) static constant 属性名称:属性类型=值 (声明常量)
2.7. 声明和访问类的方法
38、function 方法名称(参数...):返回类型{}
静态方法创建:static function 方法名称(参数...):返回类型{}
方法的访问:实例名.方法
隐式获取和设置类属性
function get 方法名(参数...):返回类型{return 属性}
function set 方法名(参数...):void {属性=参数}
2.8. 类的使用
3种类的使用方法。(1)绑定文档类;(2)绑定库元件类;(3)import导入外部类
2.8.1. 文档类
文档类必须是继承自sprite类或movieclip类的子类
文档类将时间轴上的代码放在文档中,在文档属性中绑定,实现文档与代码分离
2.8.2. 与库文件绑定
与库中影片剪辑绑定,每个影片剪辑绑定一个类
例:水泡
2.8.3. import导入类
2.9. 包外类
一个类文件可定义多个类,但包块内只能定义一个类,即主类。主类名称要与类文件名称相同。包块外可定义多个类,名称与类文件名称不同
例包外类 Draw.as






