對象數組
比如要構建一個(gè)有很多屬性的數組,簡(jiǎn)單的可以這樣做:
以下是引用片段:
vara:Array=newArray();
for(vari=0;i<10;i++){
a[i]=newObject();
a[i].x=10;
a[i].y=10*i;
a[i].name="---";
a[i].id=i;
//隨便你給什么屬性啊。
}
////先用局部變量存儲對象會(huì )更好一點(diǎn)。
vara=newArray()
for(vari=0;i<10;i++){
varta=newObject();
ta.x=10;
ta.y=10;
ta.name="n"+i;
a.push(ta);
}
////或者更簡(jiǎn)便一點(diǎn)的方法:
vara=newArray()
for(vari=0;i<10;i++){
a[i]={x:10,y:10,name:"n"+i}
}
程序控制角色運動(dòng)
下面這段代碼控制 MovieClip mc 從 (50,50)
橫向運動(dòng)到(100,50) 停止,速度為 5 pixel:
以下是引用片段:
mc._x=mc._y=50;
mc.onEnterFrame=function(){
_x+=5;
trace(_x);
if(_x==100){
delete(mc.onEnterFrame);
}
};
精確計時(shí)
我們設定了時(shí)間為 60 秒,然后通過(guò) setInterval
來(lái)定期(每1000milliseconds)觸發(fā)一個(gè)函數 runTimer。
function runTimer 用來(lái)計時(shí),當時(shí)間到了以后,轉去執行
outThere。
function outThere
用來(lái)處理時(shí)間到了以后的動(dòng)作,不要忘記
clearInterval(intervalID),停止計時(shí)。
以下是引用片段:
vartime:Number=60;
varintervalID:Number;
intervalID=setInterval(runTimer,1000);
functionrunTimer(){
time--;
trace(time);
if(time==0){
outThere();
}
}
functionoutThere(){
//blahblahblah
clearInterval(intervalID);
}
找到目前最小的一個(gè)可用的深度 Depth(來(lái)自國外)
針對 Flash Player 6 的:
以下是引用片段:
availTopDepth=function(){
varallDepths=[];
for(varzin_root){
if(_root[z]instanceofButton||_root[z]instanceofMovieClip||_root[z]instanceofTextField){
allDepths.push(_root[z].getDepth());
}
}
if(allDepths.length!=0){
sortAll=function(a,b){if(ab){return1;}else{return0;}};
allDepths.sort(sortAll);
return(parseInt(allDepths[allDepths.length-1])+1);
}
};
trace(_root.availTopDepth());放置一個(gè) MovieClip 在
Stage,再執行這段 Action
就會(huì )得到最近的一個(gè)可用深度。我們也可以用這個(gè)來(lái)創(chuàng )建絕對不
會(huì )出問(wèn)題的 MovieClip,比如:
_root.createEmptyMovieClip("mc_name", availTopDepth());
getNextHighestDepth() 以及 getInstanceAtDepth(depth)是 for player 7
的。
鼠標消隱
鼠標消隱之后,右健彈出菜單,鼠標就又出現了,并且一直保留著(zhù)~
完整的解決方法是:在
左健抬起、右健第二次抬起、回車(chē)鍵抬起的時(shí)候再次消隱鼠標。
完整的方法比較復雜,下面是一個(gè)簡(jiǎn)單的解決方法,可以解決絕大多數的問(wèn)題:
以下是引用片段:
onEnterFrame=function(){
if(Key.isDown(1)||Key.isDown(Key.ENTER)){
Mouse.hide();
}
}
我常用的一個(gè)加速度移動(dòng)的代碼
以下是引用片段:
//以下代碼放到主場(chǎng)景第一幀
stop();
_global.a=5;
//移動(dòng)加速度,越大越慢
_global.click_x=0;
//用來(lái)記錄點(diǎn)擊鼠標的位置
_global.click_y=0;
_root.onMouseDown=function(){
_global.click_x=_root._xmouse;
_global.click_y=_root._ymouse;
//me是受控mc的instancename
me.onEnterFrame=function(){
if(Math.abs(_global.click_x-me._x)<2&&Math.abs(_global.click_y-me._y)<2){
//如果已經(jīng)基本移到了鼠標點(diǎn)過(guò)的位置就取消這個(gè)事件句柄的響應程序
delete(this.onEnterFrame);
return;
}else{
//控制移動(dòng)
me._x+=(_global.click_x-me._x)/_global.a;
me._y+=(_global.click_y-me._y)/_global.a;
}
};
};
//////以下部分可選
//a_v是個(gè)可以輸入的文本框,用來(lái)輸入加速度,即可以自定義速度,方便調試
a_v.onChanged=function(){
if(a_v.text==""||Number(a_v.text)>1000||Number(a_v.text)<0){
//defaultvalue
a_v.text=5;
}else{
_global.a=Number(a_v.text)?Number(a_v.text):5;
//trace(_global.a);
}
};
隨機輸出1到100而不從復的語(yǔ)句:
以下是引用片段:
seq=newArray(100);
pArray=newArray(100);
functionmakeRandom(){
for(i=1;i<=100;i++){
seq[i]="A";
}
}
functionmRandom(){
while(true){
n=int(random(100))+1;
if(seq[n]=="A"){
seq[n]="0";
break;
}
}
return(n);
}
functionrArray(){
for(i=1;i<=100;i++){
pArray[i]=mRandom();
trace(pArray[i]);
}
}
stop();
偷梁換柱
我們可以用這樣一個(gè)技巧,在某些函數外部加一些東西而不需要了解函數的代碼~~
比如,假如當前有很多mc
覆蓋了onEnterFrame函數,我們可以這樣了解那些在_root下的mc
的onEnterFrame函
數是以什么順序執行的:
代碼:
以下是引用片段:
for(variin_root){
if(_root[i].onEnterFrame!=null){//如果這個(gè)Object實(shí)現了onEnterFrame接口的話(huà)
_root[i].oldFunc=_root[i].onEnterFrame;//首先保存原來(lái)的onEnterFrame的句柄
_root[i].onEnterFrame=function(){//然后開(kāi)始替換了~~加上一層殼~~
trace(this+":onEnterFrameCalled.");
this.oldFunc();//我們用保留的句柄調用原來(lái)的函數
trace(this+":onEnterFrameReturned.");
}
}
}
如果要取消這些附加的操作:
代碼:
以下是引用片段:
for(variin_root){
if(_root[i].oldFunc!=null){//如果發(fā)現改過(guò)得痕跡
_root[i].onEnterFrame=_root[i].oldFunc;
delete(oldFunc);
}
}
呵呵這些操作的關(guān)鍵在于 Flash里面的引用機制:
所有函數名都是引用,而函數本身是浮在數據的海洋里面的。如果沒(méi)有任何變量引用他,他就會(huì )被回收。如果有,
他就不會(huì )被回收。所以有著(zhù)樣一個(gè)有趣的事情:delete函數不會(huì )刪掉任何東西,除了要求刪掉的那個(gè)名字:(和java
機制相似,而和C不同)
以下是引用片段:
a=function(){trace("Functionacalled");}
b=a;
delete(a);//除了a這個(gè)名字被刪掉以外,沒(méi)有任何事情發(fā)生
b();
函數通過(guò)this得到其調用者的實(shí)例。
MovieClipPlus.as
定義了一些簡(jiǎn)單的MC操作
//畫(huà)點(diǎn):由于Flash沒(méi)有畫(huà)點(diǎn),那我們就畫(huà)短線(xiàn)
以下是引用片段:
MovieClip.prototype.point=OxMovieClipPoint;
functionOxMovieClipPoint(x,y){
this.moveTo(x,y);
this.lineTo(x+1,y);
}
//畫(huà)矩形,左上角x1,y1 右下角x2,y2, 顏色rgb,
不透明度alpha
以下是引用片段:
MovieClip.prototype.rect=OxMovieClipRect;
functionOxMovieClipRect(x1,y1,x2,y2,rgb,alpha){
this.beginFill(rgb,alpha);
this.moveTo(x1,y1);
this.lineTo(x1,y2);
this.lineTo(x2,y2);
this.lineTo(x2,y1);
this.lineTo(x1,y1);
this.endFill();
}
//畫(huà)圓:這么bt的冬冬當然不是我寫(xiě)的,作者素JodyKeating
//圓心x,y,半徑r
MovieClip.prototype.circle=OxMovieClipCircle;
functionOxMovieClipCircle(x,y,r){
vara=r*0.414213562;
varb=r*0.707106781;
this.moveTo(x+r,y);
this.curveTo(x+r,y-a,x+b,y-b);
this.curveTo(x+a,y-r,x,y-r);
this.curveTo(x-a,y-r,x-b,y-b);
this.curveTo(x-r,y-a,x-r,y);
this.curveTo(x-r,y+a,x-b,y+b);
this.curveTo(x-a,y+r,x,y+r);
this.curveTo(x+a,y+r,x+b,y+b);
this.curveTo(x+r,y+a,x+r,y);
}
兩點(diǎn)間的直線(xiàn)移動(dòng)
以下是引用片段:
vars=15;
_root.onMouseDown=function(){
varoldM_x=_root._xmouse;
varoldM_y=_root._ymouse;
ax=aa._x;
ay=aa._y;
dis=Math.sqrt((oldM_x-ax)*(oldM_x-ax)+(oldM_y-ay)*(oldM_y-ay));
xa=(oldM_x-ax)/dis;
ya=(oldM_y-ay)/dis;
amove();
};
functionamove(){
onEnterFrame=function(){
aa._x+=s*xa;
aa._y+=s*ya;
if(Math.sqrt((aa._x-ax)*(aa._x-ax)+(aa._y-ay)*(aa._y-ay))>dis){
deleteonEnterFrame;
}
};
}
計算兩個(gè)對象之間/兩點(diǎn)之間的距離(注冊點(diǎn))
以下是引用片段:
functiongetDistanceOf(target1,target2,x2,y2){
if(arguments.length==4){
dx=x2-target1;
dy=y2-target2;
}elseif(arguments.length==2){
dx=target2._x-target1._x;
dy=target2._y-target1._y;
}
returnMath.sqrt(dx*dx+dy*dy);
}
//Arguments
對象是一個(gè)數組,其中包含作為參數傳遞給任何函數的值。每次在動(dòng)作腳本中調用函數時(shí),都會(huì )為該函
數自動(dòng)創(chuàng )建 Arguments 對象。同時(shí)還會(huì )創(chuàng )建一個(gè)局部變量
arguments,使您可引用 arguments 對象。
讓播放的MC暫停一段時(shí)間
以下是引用片段:
functionpausePlay(sec){
pfunc=function(){
this.play();
clearInterval(this.pint);
}
stop();
this.pint=setInterval(this,"pfunc",sec*1000);
}
//這樣調用.sec是暫停的時(shí)間,單位是秒.
pausePlay(2);
onHitTest(target),自己寫(xiě)的一個(gè)MC事件,當該MC與指定的MC
hitTest的時(shí)候觸發(fā)事件.其實(shí)也沒(méi)什么特別的地方,一樣也是用setInterval來(lái)實(shí)現
以下是引用片段:
stop();
MovieClip.prototype.listen=function(target){
if(this.isHiting==undefined){
this.isHiting=this.hitTest(target);
}
if(this.hitTest(target)){
if(this.isHiting==false){
this.broadcastMessage("onHitTest",this,target);//廣播事件,給事件傳遞this和target兩個(gè)參數
}
this.isHiting=true;
}else{
this.isHiting=false;
}
};//為MovieClip添加域成員listen成員,用于監視當前對象與目標是否碰撞
MovieClip.prototype.watch=function(target){
this.timer=setInterval(this,"listen",50,target);
};//以每50毫秒檢測一次的速度來(lái)檢測是否碰撞
MovieClip.prototype.unWatch=function(){
clearInterval(this.timer);
};//停止對對象的監視
ASBroadcaster.initialize(MovieClip.prototype);//初始化MovieClip原型為事件源
//下面是調用的示例
//假設有兩個(gè)MovieClip,左邊ball,右邊wall,讓ball不斷往wall移動(dòng),同時(shí)監視wall,一旦擊中觸發(fā)事件onHitTest
ball.onEnterFrame=function(){
this._x+=5;
};//讓ball不斷往右方移動(dòng)工
myListener=newObject();
myListener.onHitTest=function(source,target){
trace("The"+source._name+"hit"+target._name+".");
};
ball.addListener(myListener);//創(chuàng )建監聽(tīng)員并注冊給ball
ball.watch(wall);//讓ball監視wall
MD5 32位碼的Flash算法
以下是引用片段:
//-----------
functionmd5(s){
returnbinl2hex(core_md5(str2binl(s),s.length*strsize));
}
functioncore_md5(x,len){
x[len>>5]=(x[len>>5])|(128<<len%32);
x[(((len+64)>>>9)<<4)+14]=len;
vara=1732584193;
varb=-271733879;
varc=-1732584194;
vard=271733878;
vari=0;
while(ivarolda=a;
varoldb=b;
varoldc=c;
varoldd=d;
a=md5_ff(a,b,c,d,x[i+0],7,-680876936);
d=md5_ff(d,a,b,c,x[i+1],12,-389564586);
c=md5_ff(c,d,a,b,x[i+2],17,606105819);
b=md5_ff(b,c,d,a,x[i+3],22,-1044525330);
a=md5_ff(a,b,c,d,x[i+4],7,-176418897);
d=md5_ff(d,a,b,c,x[i+5],12,1200080426);
c=md5_ff(c,d,a,b,x[i+6],17,-1473231341);
b=md5_ff(b,c,d,a,x[i+7],22,-45705983);
a=md5_ff(a,b,c,d,x[i+8],7,1770035416);
d=md5_ff(d,a,b,c,x[i+9],12,-1958414417);
c=md5_ff(c,d,a,b,x[i+10],17,-42063);
b=md5_ff(b,c,d,a,x[i+11],22,-1990404162);
a=md5_ff(a,b,c,d,x[i+12],7,1804603682);
d=md5_ff(d,a,b,c,x[i+13],12,-40341101);
c=md5_ff(c,d,a,b,x[i+14],17,-1502002290);
b=md5_ff(b,c,d,a,x[i+15],22,1236535329);
a=md5_gg(a,b,c,d,x[i+1],5,-165796510);
d=md5_gg(d,a,b,c,x[i+6],9,-1069501632);
c=md5_gg(c,d,a,b,x[i+11],14,643717713);
b=md5_gg(b,c,d,a,x[i+0],20,-373897302);
a=md5_gg(a,b,c,d,x[i+5],5,-701558691);
d=md5_gg(d,a,b,c,x[i+10],9,38016083);
c=md5_gg(c,d,a,b,x[i+15],14,-660478335);
b=md5_gg(b,c,d,a,x[i+4],20,-405537848);
a=md5_gg(a,b,c,d,x[i+9],5,568446438);
d=md5_gg(d,a,b,c,x[i+14],9,-1019803690);
c=md5_gg(c,d,a,b,x[i+3],14,-187363961);
b=md5_gg(b,c,d,a,x[i+8],20,1163531501);
a=md5_gg(a,b,c,d,x[i+13],5,-1444681467);
d=md5_gg(d,a,b,c,x[i+2],9,-51403784);
c=md5_gg(c,d,a,b,x[i+7],14,1735328473);
b=md5_gg(b,c,d,a,x[i+12],20,-1926607734);
a=md5_hh(a,b,c,d,x[i+5],4,-378558);
d=md5_hh(d,a,b,c,x[i+8],11,-2022574463);
c=md5_hh(c,d,a,b,x[i+11],16,1839030562);
b=md5_hh(b,c,d,a,x[i+14],23,-35309556);
a=md5_hh(a,b,c,d,x[i+1],4,-1530992060);
d=md5_hh(d,a,b,c,x[i+4],11,1272893353);
c=md5_hh(c,d,a,b,x[i+7],16,-155497632);
b=md5_hh(b,c,d,a,x[i+10],23,-1094730640);
a=md5_hh(a,b,c,d,x[i+13],4,681279174);
d=md5_hh(d,a,b,c,x[i+0],11,-358537222);
c=md5_hh(c,d,a,b,x[i+3],16,-722521979);
b=md5_hh(b,c,d,a,x[i+6],23,76029189);
a=md5_hh(a,b,c,d,x[i+9],4,-640364487);
d=md5_hh(d,a,b,c,x[i+12],11,-421815835);
c=md5_hh(c,d,a,b,x[i+15],16,530742520);
b=md5_hh(b,c,d,a,x[i+2],23,-995338651);
a=md5_ii(a,b,c,d,x[i+0],6,-198630844);
d=md5_ii(d,a,b,c,x[i+7],10,1126891415);
c=md5_ii(c,d,a,b,x[i+14],15,-1416354905);
b=md5_ii(b,c,d,a,x[i+5],21,-57434055);
a=md5_ii(a,b,c,d,x[i+12],6,1700485571);
d=md5_ii(d,a,b,c,x[i+3],10,-1894986606);
c=md5_ii(c,d,a,b,x[i+10],15,-1051523);
b=md5_ii(b,c,d,a,x[i+1],21,-2054922799);
a=md5_ii(a,b,c,d,x[i+8],6,1873313359);
d=md5_ii(d,a,b,c,x[i+15],10,-30611744);
c=md5_ii(c,d,a,b,x[i+6],15,-1560198380);
b=md5_ii(b,c,d,a,x[i+13],21,1309151649);
a=md5_ii(a,b,c,d,x[i+4],6,-145523070);
d=md5_ii(d,a,b,c,x[i+11],10,-1120210379);
c=md5_ii(c,d,a,b,x[i+2],15,718787259);
b=md5_ii(b,c,d,a,x[i+9],21,-343485551);
a=safe_add(a,olda);
b=safe_add(b,oldb);
c=safe_add(c,oldc);
d=safe_add(d,oldd);
i=i+16;
}
returnArray(a,b,c,d);
}
functionmd5_cmn(q,a,b,x,s,t){
returnsafe_add(bit_rol(safe_add(safe_add(a,q),safe_add(x,t)),s),b);
}
functionmd5_ff(a,b,c,d,x,s,t){
returnmd5_cmn((b&c)|((~b)&d),a,b,x,s,t);
}
functionmd5_gg(a,b,c,d,x,s,t){
returnmd5_cmn((b&d)|(c&(~d)),a,b,x,s,t);
}
functionmd5_hh(a,b,c,d,x,s,t){
returnmd5_cmn((b^c)^d,a,b,x,s,t);
}
functionmd5_ii(a,b,c,d,x,s,t){
returnmd5_cmn(c^(b|(~d)),a,b,x,s,t);
}
functionsafe_add(x,y){
varlsw=(x&65535)+(y&65535);
varmsw=((x>>16)+(y>>16))+(lsw>>16);
return(msw<<16)|(lsw&65535);
}
functionbit_rol(num,cnt){
return(num<<cnt)|(num>>>(32-cnt));
}
functionstr2binl(str){
varbin=Array();
varmask=(1<<strsize)-1;
vari=0;
while(i<(str.length*strsize)){
bin[i>>5]=(bin[i>>5])|((str.charCodeAt(i/strsize)&mask)<<i%32);
i=i+strsize;
}
returnbin;
}
functionbinl2hex(binarray){
if(hexcase){
}else{
}
varhex_tab="0123456789abcdef";
varstr="";
vari=0;
while(i<(binarray.length*4)){
str=str+(hex_tab.charAt(((binarray[i>>2])>>((i%4*8)+4))&15)+hex_tab.charAt(((binarray[i
>>2])>>(i%4*8))&15));
i++;
}
returnstr;
}
varhexcase=0;
varstrsize=8;
//--------以上不用修改,
b=md5("xx");
//xx可設為任意字符
s=b.toUpperCase();
//轉換成大寫(xiě)
trace(b);
trace(s);
發(fā)點(diǎn)緩動(dòng)函數 以下是引用片段:
Math.linearTween=function(t,b,c,d){
returnc*t/d+b;
};
//線(xiàn)性運動(dòng)函數
Math.easeInQuad=function(t,b,c,d){
returnc*(t/=d)*t+b;
};
//二次緩入函數
Math.easeOutQuad=function(t,b,c,d){
return-c*(t/=d)*(t-2)+b;
};
//二次緩出函數
Math.easeINOutQuad=function(t,b,c,d){
if((t/=d/2)<1){
returnc/2*t*t+b;
}
return-c/2*((--t)*(t-2)-1)+b;
};
//二次緩入緩出函數
Math.easeInCubic=function(t,b,c,d){
returnc*Math.pow(t/d,3)+b;
};
//三次緩入函數
Math.easeOutCubic=function(t,b,c,d){
returnc*(Math.pow(t/d-1,3)+1)+b;
};
//三次緩出函數
Math.easeINOutCubic=function(t,b,c,d){
if((t/=d/2)<1){
returnc/2*Math.pow(t,3)+b;
}
returnc/2*(Math.pow(t-2,3)+2)+b;
};
//三次緩入緩出函數
Math.easeInQuart=function(t,b,c,d){
returnc*Math.pow(t/d,4)+b;
};
//四次緩入函數
Math.easeOutQuart=function(t,b,c,d){
return-c*(Math.pow(t/d-1,4)-1)+b;
};
//四次緩出函數
Math.easeINOutQuart=function(t,b,c,d){
if((t/=d/2)<1){
returnc/2*Math.pow(t,4)+b;
}
return-c/2*(Math.pow(t-2,4)-2)+b;
};
//四次緩入緩出函數
Math.easeInQuint=function(t,b,c,d){
returnc*Math.pow(t/d,5)+b;
};
//五次緩入函數
Math.easeOutQuint=function(t,b,c,d){
returnc*(Math.pow(t/d-1,5)+1)+b;
};
//五次緩出函數
Math.easeINOutQuint=function(t,b,c,d){
if((t/=d/2)<1){
returnc/2*Math.pow(t,5)+b;
}
returnc/2*(Math.pow(t-2,5)+2)+b;
};
//五次緩入緩出函數
Math.easeInSine=function(t,b,c,d){
returnc*(1-Math.cos(t/d*(Math.PI/2)))+b;
};
//正弦緩出函數
Math.easeOutSine=function(t,b,c,d){
returnc*Math.sin(t/d*(Math.PI/2))+b;
};
//正弦緩出函數
Math.easeINOutSine=function(t,b,c,d){
returnc/2*(1-Math.cos(Math.PI*t/d))+b;
};
//正弦緩入緩出函數
Math.easeInExpo=function(t,b,c,d){
returnc*Math.pow(2,10*(t/d-1))+b;
};
//指數緩入函數
Math.easeOutExpo=function(t,b,c,d){
returnc*(-Math.pow(2,-10*t/d)+1)+b;
};
//指數緩出函數
Math.easeINOutExpo=function(t,b,c,d){
if((t/=d/2)<1){
returnc/2*Math.pow(2,10*(t-1))+b;
}
returnc/2*(-Math.pow(2,-10*--t)+2)+b;
};
//指數緩入緩出函數
Math.easeInCirc=function(t,b,c,d){
returnc*(1-Math.sqrt(1-(t/=d)*t))+b;
};
//圓形緩入函數
Math.easeOutCirc=function(t,b,c,d){
returnc*Math.sqrt(1-(t=t/d-1)*t)+b;
};
//圓形緩出函數
Math.easeINOutCirc=function(t,b,c,d){
if((t/=d/2)<1){
returnc/2*(1-Math.sqrt(1-t*t))+b;
}
returnc/2*(Math.sqrt(1-(t-=2)*t)+1)+b;
};
//圓形緩入緩出函數
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。