背景:#EDF0F5 #FAFBE6 #FFF2E2 #FDE6E0 #F3FFE1 #DAFAF3 #EAEAEF 默认  
阅读内容

[推荐]几种常用的Flash特效制作源代码

[日期:2008-02-17] 来源:  作者:佚名 [字体: ]

对象数组

比如要构建一个有很多属性的数组,简单的可以这样做:

以下是引用片段:

 

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;

//随便你给什么属性啊。

}

////先用局部变量存储对象会更好一点。

vara=newArray()

for(vari=0;i<10;i++){

varta=newObject();

ta.x=10;

ta.y=10;

ta.name="n"+i;

a.push(ta);

}

////或者更简便一点的方法:

vara=newArray()

for(vari=0;i<10;i++){

a[i]={x:10,y:10,name:"n"+i}

}

程序控制角色运动

下面这段代码控制 MovieClip mc 从 (50,50) 横向运动到(100,50) 停止,速度为 5 pixel:

以下是引用片段:

 

mc._x=mc._y=50;

mc.onEnterFrame=function(){

_x+=5;

trace(_x);

if(_x==100){

delete(mc.onEnterFrame);

}

};

精确计时

我们设定了时间为 60 秒,然后通过 setInterval 来定期(每1000milliseconds)触发一个函数 runTimer。

function runTimer 用来计时,当时间到了以后,转去执行 outThere。

function outThere 用来处理时间到了以后的动作,不要忘记 clearInterval(intervalID),停止计时。

以下是引用片段:

 

vartime:Number=60;

varintervalID:Number;

intervalID=setInterval(runTimer,1000);

functionrunTimer(){

time--;

trace(time);

if(time==0){

outThere();

}

}

functionoutThere(){

//blahblahblah

clearInterval(intervalID);

}

找到目前最小的一个可用的深度 Depth(来自国外)

针对 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());放置一个 MovieClip 在 Stage,再执行这段 Action 就会得到最近的一个可用深度。我们也可以用这个来创建绝对不

会出问题的 MovieClip,比如:

_root.createEmptyMovieClip("mc_name", availTopDepth());

getNextHighestDepth() 以及 getInstanceAtDepth(depth)是 for player 7 的。

鼠标消隐

鼠标消隐之后,右健弹出菜单,鼠标就又出现了,并且一直保留着~

完整的解决方法是:在 左健抬起、右健第二次抬起、回车键抬起的时候再次消隐鼠标。

完整的方法比较复杂,下面是一个简单的解决方法,可以解决绝大多数的问题:

以下是引用片段:

 

onEnterFrame=function(){

if(Key.isDown(1)||Key.isDown(Key.ENTER)){

Mouse.hide();

}

}

我常用的一个加速度移动的代码

以下是引用片段:

 

//以下代码放到主场景第一帧

stop();

_global.a=5;

//移动加速度,越大越慢

_global.click_x=0;

//用来记录点击鼠标的位置

_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){

//如果已经基本移到了鼠标点过的位置就取消这个事件句柄的响应程序

delete(this.onEnterFrame);

return;

}else{

//控制移动

me._x+=(_global.click_x-me._x)/_global.a;

me._y+=(_global.click_y-me._y)/_global.a;

}

};

};

//////以下部分可选

//a_v是个可以输入的文本框,用来输入加速度,即可以自定义速度,方便调试

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而不从复的语句:

以下是引用片段:

 

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();

偷梁换柱

我们可以用这样一个技巧,在某些函数外部加一些东西而不需要了解函数的代码~?/P>

比如,假如当前有很多mc 覆盖了onEnterFrame函数,我们可以这样了解那些在_root下的mc 的onEnterFrame函

数是以什么顺序执行的:

代码:

以下是引用片段:

 

for(variin_root){

if(_root[i].onEnterFrame!=null){//如果这个Object实现了onEnterFrame接口的话

_root[i].oldFunc=_root[i].onEnterFrame;//首先保存原来的onEnterFrame的句柄

_root[i].onEnterFrame=function(){//然后开始替换了~~加上一层壳~~

trace(this+":onEnterFrameCalled.");

this.oldFunc();//我们用保留的句柄调用原来的函数

trace(this+":onEnterFrameReturned.");

}

}

}

如果要取消这些附加的操作:

代码:

以下是引用片段:

 

for(variin_root){

if(_root[i].oldFunc!=null){//如果发现改过得痕迹

_root[i].onEnterFrame=_root[i].oldFunc;

delete(oldFunc);

}

}

呵呵这些操作的关键在于 Flash里面的引用机制:

所有函数名都是引用,而函数本身是浮在数据的海洋里面的。如果没有任何变量引用他,他就会被回收。如果有,

他就不会被回收。所以有着样一个有趣的事情:delete函数不会删掉任何东西,除了要求删掉的那个名字:(和java

机制相似,而和C不同)

以下是引用片段:

 

a=function(){trace("Functionacalled");}

b=a;

delete(a);//除了a这个名字被删掉以外,没有任何事情发生

b();

函数通过this得到其调用者的实例。

MovieClipPlus.as

定义了一些简单的MC操作

//画点:由于Flash没有画点,那我们就画短线

以下是引用片段:

MovieClip.prototype.point=OxMovieClipPoint;

functionOxMovieClipPoint(x,y){

this.moveTo(x,y);

this.lineTo(x+1,y);

}

//画矩形,左上角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();

}

//画圆:这么bt的冬冬当然不是我写的,作者素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);

}

两点间的直线移动

以下是引用片段:

 

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;

}

};

}

阅读:
录入:admin

推荐 】 【 打印
相关新闻      
本文评论       全部评论
发表评论
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款


点评: 字数
姓名:
内容查询