AS3实用函数与常用算法.docx
《AS3实用函数与常用算法.docx》由会员分享,可在线阅读,更多相关《AS3实用函数与常用算法.docx(15页珍藏版)》请在冰豆网上搜索。
AS3实用函数与常用算法
AS3实用函数与常用算法
【鼠标坐标】
mouseXmouseY
【检查变量类型并返回布尔值】
is
【检查变量类型并返回类型】
typeof
【检查对象类型并返回该对象】
as
【是数字但不是有效数字问题】
varquantity:
Number=15–“rabbits”;trace(typeofquantity);//显示:
“number”,但它是NaN(notanumber)trace(quantityisNumber);//truetrace(quantity!
=NaN);//false//使用isNaN()函数检测:
isNaN(quantity);//true//检测变量是否内含有效数字:
!
isNaN(quantity);//false
【取消默认的严格编译模式】
在”Navigator”窗框里右键你的项目>选中”Properties”>选中”ActionScriptCompiler”>取消”Enabelcompile-timetypechecking”选项
【基元数据类型和复杂数据类型好比”值类型”和”引用类型”】
基元数据类型类似按值传递:
varintOne:
int=1;varintTwo:
int=1;trace(intOne==intTwo);//true
【复杂数据类型类似按引用传递】
vararrayOne:
Array=newArray(“a”,“b”);vararrayTwo:
Array=arrayOne;trace(arrayOne==arrayTwo);//true//———————————–vararrayOne:
Array=newArray(“a”,“b”);vararrayTwo:
Array=newArray(“a”,“b”);trace(arrayOne==arrayTwo);//false
【优化逻辑AND(&&)和OR(||)的小知识】
对于逻辑And(&&):
除非条件表达式的前半部分为真,否则,ActionScript不会再去求算逻辑AND运算符的后半部.如果前半部为假,整个条件表达式一定为假,所以再去求算后半部就没效率了.对于逻辑OR(||):
除非条件表达式前半部为假,否则,ActionScript不会再去求算逻辑OR运算符的后半部,如果前半部为真,整个条件表达式一定为真.总结:
使用逻辑AND(&&)时,把结果最可能为false的表达式放到前面;使用逻辑OR(||)时,把结果最可能为true的表达式放到前面.
【Timer类注意事项】
不要认为Timer可以极其准确;使用Timer时间间隔不要低于10毫秒.
【private,protected,internal,public访问权限】
private:
只能在类本身内部访问,按惯例,命名私有成员时以下划线”_”开头;protected:
可以由类本身或任何子类访问.但这是以实例为基础的.换言之,类实例可以访问自己的保护成员或者父类的保护成员,但不能访问相同类的其它实例的保护成员,按惯例,命名保护成员时以下划线”_”开头;internal:
可以由类本身或者相同包内的任何类访问;public:
可以在类内部访问,也可以由类实例访问,或者声明为static时,可以直接从类访问.
【一个函数具有未知个数的参数,用arguments对象或”…(rest)”符号访问它的参数】
注意:
使用”…(rest)”参数会使arguments对象不可用;privatefuncitonaverage():
void{trace(arguments.length);//输出参数的个数//arguments的类型是:
object,但可以像访问数组一样去访问它trace(arguments[1]);//输出第二个参数}privatefunctionaverage(…argu):
void{trace(argu[1]);//输出第二个参数,argu参数名是自定义的.}
【错误处理try,catch,finally】
privatefunctiontryError():
void{try{trace(“测试开始-try”);throwError();}catch(errObject:
Error){trace(“错误信息:
”+errObject.message);trace(“测试结束-catch”);return;}finally{trace(“虽然catch里已经有return方法,但位于return方法后面的finally里的代码依然会被执行.其实无论return方法是在try里,还是catch里,finally里的代码始终会被执行”);}trace(“前面已经有return了,此处是不会再执行的.除非没有抛出错误,以使catch里的代码没有被执行”);}privatefunctionthrowError():
void{thrownewError(“抛出错误”);}
【for…in与foreach…in的区别】
与for…in循环不同的是,foreach…in循环中的迭代变量包含属性所保存的值,而不包含属性的名称(或主键,索引).
【命名包路径的小技巧】
使用相应于拥有者和相关项目的包名称会比较好.按惯例来讲,包名称的开头应该是逆向的网址名称.例如,如果ExampleCorp()写了一些actionscript3.0类,就会把所有类放在com.examplecorp包内(或者com.examplecorp的子包内).如此一来,如果英国有另一家ExampleCorp(examplecorp.co.uk)也写了一些ActionScript3.0类,只要使用包uk.co.examplecorp,就可确保唯一性.当类属于特定应用程序的一部分时,就应该放在该应用程序特定的子包内.例如,ExampleCorp可能有个应用程序名叫WidgetStore.如果WidgetStore应用程序使用一个名为ApplicationManager的类,则此类就应该放在com.examplecorp.widgetstore包内,或者位于该包的子包内.按惯例来说,包名称的开头是小写字母.
【隐式的取出方法(getter)和设定方法(setter)】
publicfunctiongetcount():
uint{return_count;}publicfunctionsetcount(value:
uint):
uint{if(value<100){_count=value;}else{throwError();}}
【确保类是绝不会有子类,使用final】
finalpublicclassExample{}
【super关键字的使用】
super();//父类的构造函数,只能在类实例构造函数内部使用super.propertyName;//调用父类的属性,属性需要声明为public或protectedsuper.methodName();//调用父类的方法,方法需要声明为public或protected
【建立常数,使用关键字const而不是var】
staticpublicconstEXAMPLE:
String=“example”;
【检测播放器版本】
Flash.system.Capabilities.version对于8.5版以前的任何FlashPlayer版本,这种方法都不适用.
【判断客户端系统】
flash.system.Capabilities.os
【检测播放器类型】
flash.system.Capabilities.playerType可能的值有:
“StandAlone”,用于独立的FlashPlayer“External”,用于外部的FlashPlayer或处于测试模式下“PlugIn”,用于FlashPlayer浏览器插件“ActiveX”,用于MicrosoftInternetExplorer使用的FlashPlayerActiveX控件
【检测系统语言】
flash.system.Capabilities.language
【判断用户是否启用了IME(输入法编辑器)】
flash.system.IME.enabled
【检测屏幕的分辨率】
flash.system.Capabilities.screenResolutionXflash.system.Capabilities.screenResolutionY
【把弹出窗口居中的算法】
X=(舞台宽/2)-(窗口宽/2)Y=(舞台高/2)-(窗口高/2)
【控制影片配合Player的方式,包括缩放问题】
stage.scaleMode可供选择值:
flash.display.StageScaleMode
【舞台的对齐方式】
stage.align可供选择值:
flash.display.StageAlign
【隐藏FlashPlayer的右键菜单】
stage.showDefaultContextMenu=false;
【检测系统是否具有音频功能】
flash.system.Capabilities.hasAudio
【检测播放器是在具有MP3解码器的系统上运行,还是在没有MP3解码器的系统上运行】
flash.system.Capabilities.hasMP3
【检测播放器能(true)还是不能(false)播放流式视频】
flash.system.Capabilities.hasStreamingVideo
【检测播放器是在支持(true)嵌入视频的系统上运行,还是在不支持(false)嵌入视频的系统上运行】
flash.system.Capabilities.hasEmbeddedVideo
【检测播放器能(true)还是不能(false)对视频流(如来自Web摄像头的视频流)进行编码】
flash.system.Capabilities.hasVideoEncoder
【显示FlashPlayer中的”安全设置”面板】
flash.system.Security.showSettings();可供选择项:
flash.system.SecurityPanel
【让其它域的.swf访问本域的.swf】
在本域的.swf文件里加上:
flash.system.Security.allowDomain()或者使用安全策略文件”crossdomain.xml”.在Flash8以前,这个文件必须放在.swf所在域的根目录,现在,你可以使用flash.system.Security.loadPolicyFile(),指定安全策略文件所在的位置.拒绝任何域的做法是在标签内什么也不填,安全策略文件也支持通用字符“*”:
xmlversion=”1.0″?
>
––>//as3.aa-
【数字的不同进制之间的转换】
parseInt(str:
String,radix:
uint=0):
Number返回十进制的数,参数radix表示要分析的数字的基数.如果省略radix,就默认为10,除非字符串的开头是”0x”,”0X”或”0″:
trace(parseInt(“0×12″));//设定radix为16,输出:
18trace(parseInt(“017″));//设定radix为8,输出:
15或者使用Number,uint和int对象的toString(radix)方法.
【使用Math.round()对一个数取整,四舍五入】
Math.round()trace(Math.round(204.499));//输出:
204trace(Math.round(401.5));//输出:
402
【使用Math.floor()对一个数向下取整,就是只要整数部分而不理会小数分】
trace(Math.floor(204.99));//输出:
204
【使用Math.ceil()对一个数向上取整,只要小数部分不为零,整数部分就加1】
trace(Math.ceil(401.01));//输出:
402
【产生一个随机数】
使用Math.random()产生一个伪随机数n,其中0<=n<1
【把数字取至最近的小数点位,即指定精确度】
1.决定你要取的数字的小数点位数:
例如,如果你想把90.337取成90.34,就表示你要取到两位小数点位,也就是说你想取至最近的0.01;2.让输入值除以步骤1所选的数字(此例为0.01);3.使用Math.round()把步骤2所计得的值取成最近的整数;4.把步骤3所得的结果乘以步骤2用于除法的那个值.例如,要把90.337取成两个小数点位数,可以使用:
trace(Math.round(90.337/0.01)*0.01);//输出:
90.34
【把数字取成一个整数的最接近倍数值】
例1,这样会把92.5取成5的最近倍数值:
trace(Math.round(92.5/5)*5);//输出:
95例2,这样会把92.5取成10的最近倍数值:
trace(Math.round(92.5/10)*10);//输出:
90
【在指定数值范围内获得随机数】
//可取范围:
[min,max]privatefunctionrandRange(min:
Number,max:
Number):
Number{varrandomNum:
Number=Math.floor(Math.random()*(max–min+1))+min;returnrandomNum;}应用例子:
模拟投银币,即希望得到随机布尔值(true或false):
randRange(0,1);模拟投骰子,即希望得到随机六个值:
randRange(1,6);为避免被缓存而需要产生一个独一无二的数字追加在URL尾端,通常最佳方法是取得当前毫秒数.
【弧度(radian)与度数(degree)之间的转换】
从弧度转为度数:
degrees=radians*180/Math.PI从度数转为弧度:
radians=degrees*Math.PI/180
【计算两点之间的距离】
勾股定理:
c2=a2+b2假设有两个影片剪辑mc1和mc2,则它们两点间的距离c为:
varc:
Number=Math.sqrt(Math.pow(mc1.x–mc2.x,2)+Math.pow(mc1.y–mc2.y,2));
【模拟圆周运动】
已知圆心o(x0,y0),半径r和弧度angle,求圆上任意一点P(x,y)的坐标:
x=x0+(Math.cos(angle)*r);y=y0+(Math.sin(angle)*r);注意:
舞台的x轴正方向水平向右,y轴正方向垂直向下.
【模拟椭圆运动】
已知圆心o(x0,y0),长轴a,短轴b以及弧度angle,求圆上任意一点P(x,y)的坐标:
x=x0+(Math.cos(angle)*a);y=y0+(Math.sin(angle)*b);
【华氏温度和摄氏温度之间的转换】
华氏温度=摄氏度数*9/5+32摄氏温度=(华氏度数–32)*5/9
【公斤与磅之间的转换】
公斤=磅*2.2磅=公斤/2.2
【向数组尾端添加元素】
vararray:
Array=newArray();array.push(“a”,“b”);//向数组尾端添加单一元素也可以这样:
array[array.length]=“c”;//如果以索引设定的元素不存在,数组本身会自动扩展以包含足够的元素数目.介于中间的元素会被设为undefined:
array[5]=“e”;trace(array[4]);//输出:
undefined
【向数组开端添加元素】
vararray:
Array=["a","b"];array.unshift(“c”,“d”);trace(array);//输出:
c,d,a,b
【删除数组中第一个元素并返回该元素,使用shift()方法】
varletters:
Array=newArray(“a”,“b”,“c”);varfirstLetter:
String=letters.shift();trace(letters);//输出:
b,ctrace(firstLetter);//输出:
a
【删除数组中最后一个元素并返回该元素的值,使用pop()方法】
varletters:
Array=newArray(“a”,“b”,“c”);trace(letters);//输出:
a,b,cvarletter:
String=letters.pop();trace(letters);//输出:
a,btrace(letter);//输出:
c
【删除数组中的元素,给数组添加新元素并返回删除的元素,使用splice()方法】
splice(startIndex:
int,deleteCount:
uint,…values):
ArraystartIndex:
一个整数,它指定数组中开始进行插入或删除的位置处的元素的索引;deleteCount:
一个整数,它指定要删除的元素数量;…values:
用逗号分隔的一个或多个值的可选列表或数组,此列表或数组将插入到此数组中由startIndex参数指定的位置.
【查找数组中第一个相匹配的元素】
vararray:
Array=["a","b","c","d","a","b","c","d"];varmatch:
String=“b”;for(vari:
int=0;iElementwithindex1foundtomatchbbreak;}}
【查找数组中最后一个相匹配的元素】
vararray:
Array=["a","b","c","d","a","b","c","d"];varmatch:
String=“b”;for(vari:
int=array.length–1;i>=0;i–){if(array[i]==match){trace(“Elementwithindex”+i+”foundtomatch”+match);//输出:
Elementwithindex5foundtomatchbbreak;}}
【把字符串转成数组】
使用String.split()方法:
varlist:
String=“IamYoungBoy.”;varwords:
Array=list.split(”“);//以空格作为分隔符将字符串切割trace(words);//输出:
I,am,YoungBoy.
【把数组转成字符串】
使用String.join()方法:
varmyArr:
Array=newArray(“one”,“two”,“three”);varmyStr:
String=myArr.join(”and“);trace(myArr);//输出:
one,two,threetrace(myStr);//输出:
oneandtwoandthree
【使用对象数组处理相关数据】
varcars:
Array=newArray();cars.push({make:
”Mike”,year:
1997,color:
”blue”});cars.push({make:
”Kelly”,year:
1986,color:
”red”});for(vari:
int=0;i//Mike–1997–blue//Kelly–1986–red
【在数组中获取最小或最大值】
varscores:
Array=[10,4,15,8];scores.sort(Array.NUMERIC);trace(“Minimum:
”+scores[0]);trace(“Maximum:
”+scores[scores.length-1]);
【使用for…in语句读取关联数组元素】
varmyObject:
Object=newObject();myObject.name=“YoungBoy”;myObject.age=20;for(vari:
StringinmyObject){trace(i+“:
”+myObject[i]);}//输出:
name:
YoungBoy//age:
20注意:
for…in循环不会显示对象所有的内建属性.例如,循环会显示执行期间新增的特殊属性,但是,不会列出内建对象的方法,即使都是储存在对象属性内.
【AVM(ActionScriptVirtualMachine,虚拟机)和渲染引擎(RenderingEngine)】
AVM负责执行ActionScript程序,而渲染引擎则是把对象绘制在显示器上.
【指出容器的显示清单中有多少显示对象】
每个容器都有numChildren属性.
【把项目新增至显示清单】
addChild(child:
DisplayObject)addChildAt(child:
DisplayObject,index:
int)index:
添加该子项的索引位置.如果指定当前占用的索引位置,则该位置以及所有更高位置上的子对象会在子级列表中上移一个位置.
【从显示清单中移除项目】
removeChild(child:
DisplayObject)removeChildAt(ind