注册通行证 用户名 密码
  • 文章投稿
  • 博客
  • 论坛
  • 设为首页
  • 加入收藏
jztop.com网络技术
  • 首页
  • | iT新闻
  • | 操作系统
  • | 组网建网
  • | 网络安全
  • | 程序开发
  • | 办公一族
  • | 工具软件
  • | 网页制作
  • | 多媒体制作
  • | 网吧技术
  • | 服务器
  • | 专题教程
Vista | 软件评测 | 系统备份 | 优化 | 进程 | 聊天 | 病毒 | Linux | 黑客 | 防火墙 | 数据库 | Web开发 | Java | Word | 游戏 | 32位开发 | 移动开发
当前位置:首页 > 多媒体制作 > Flash 内容正文:Flash特效制作常用的源代码大放送

Flash特效制作常用的源代码大放送

发布时间:2006-08-01 09:43:26 来源:天极网 网友评论 0 条

对象数组

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

以下是引用片段:

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

偷梁换柱

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

比如,假如当前有很多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;

}

};

}

计算两个对象之间/两点之间的距离(注册点)

以下是引用片段:

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 对象是一个数组,其中包含作为参数传递给任何函数的值。每次在动作脚本中调用函数时,都会为该函

数自动创建 Arguments 对象。同时还会创建一个局部变量 arguments,使您可引用 arguments 对象。

让播放的MC暂停一段时间

以下是引用片段:

functionpausePlay(sec){

pfunc=function(){

this.play();

clearInterval(this.pint);

}

stop();

this.pint=setInterval(this,"pfunc",sec*1000);

}

//这样调用.sec是暂停的时间,单位是秒.

pausePlay(2);

onHitTest(target),自己写的一个MC事件,当该MC与指定的MC hitTest的时候触发事件.其实也没什么特别的地方,一样也是用setInterval来实现

以下是引用片段:

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两个参数

}

this.isHiting=true;

}else{

this.isHiting=false;

}

};//为MovieClip添加域成员listen成员,用于监视当前对象与目标是否碰撞

MovieClip.prototype.watch=function(target){

this.timer=setInterval(this,"listen",50,target);

};//以每50毫秒检测一次的速度来检测是否碰撞

MovieClip.prototype.unWatch=function(){

clearInterval(this.timer);

};//停止对对象的监视

ASBroadcaster.initialize(MovieClip.prototype);//初始化MovieClip原型为事件源

//下面是调用的示例

//假设有两个MovieClip,左边ball,右边wall,让ball不断往wall移动,同时监视wall,一旦击中触发事件onHitTest

ball.onEnterFrame=function(){

this._x+=5;

};//让ball不断往右方移动工

myListener=newObject();

myListener.onHitTest=function(source,target){

trace("The"+source._name+"hit"+target._name+".");

};

ball.addListener(myListener);//创建监听员并注册给ball

ball.watch(wall);//让ball监视wall

 1/3    1 2 3 ›› ›|
相关文章
  • 遗忘的角落:FlashFXP不仅仅能传文件
  • Flash特效制作常用的源代码大放送
【评论】【收藏本文】【打印】【关闭】
上一篇文章:Flash特效制作常用的源代码大放送
下一篇文章:在Flash中添加“设为首页”“加为收藏”
讨论区
查看
已有 0 位对此新闻感兴趣的网友发表了看法
匿名发表
注册通行证 登陆
图文阅读推荐
Flash制作关于光的折射和全反射教程
Flash制作关于光的折射和全反射教程
随心所欲 玩转Flash视频——FLV
随心所欲 玩转Flash视频——FLV
Flash制作书法动画
Flash制作书法动画
推荐阅讯
  • 20个Flash制作漂亮动画的经典问题问答
  • Flash创意特效:打 字 效 果
  • Flash播放器参数知多少?
  • [视频]Flash 9 Alpha体验:软件安装
  • Flash入门应该了解的重要概念
  • Flash创意特效:时 光 如 梭
  • Flash互动电子地图制作手册——入门实例
  • Flash8绘制秋之落叶
  • 学习做FLASH留言本:分页技术
  • Flash制作春雷闪电效果实例教程
阅读排行
  • 1.利用套接字机制实现Flash与数据库连接
  • 2.FLASH9.0新功能视频体验
  • 3.[视频]Flash 9 Alpha体验:软件安装
  • 4.Flash8绘制秋之落叶
  • 5.Flash制作书法动画
  • 6.Flash互动电子地图制作手册——入门实例
  • 7.随心所欲 玩转Flash视频——FLV
  • 8.[视频]Flash 9 Alpha体验:播放器
  • 9.制作温馨浪漫Flash情人卡
  • 10.Flash软件菜单中英文对照表
专题教程
  • 大话G游 专题:手机病毒揭密
  • ARP攻击防范与解决方案 路由故障处理手册
  • Picasa中文版_Picasa教程 专题:清除流氓软件
  • Firefox专题 seo搜索引擎优化专区
  • 重装Windows必知的事情 装机之必备软件大行动
病毒专杀栏
  • 杀毒软件反被病毒杀 连"救命"都不能喊
  • 金山ARP防火墙
  • 还原卡神话破灭“机器狗”病毒来势汹汹
  • cctv经济半小时:你的手机现在安全吗?
  • 新挂马方式开始流行 ARP挂马称雄局域网
  • 木马和病毒清除的通用解法
  • IP地址不再冲突 查找ARP攻击者元凶
  • 教你几招识别和防御Web网页木马
  • 分析:封杀BT只是暂时的止痛药
  • QQ爆危险漏洞,“QQ游戏邀请大盗”邀请你玩病
关于我们 | 诚聘英才 | 联系我们 | 版权声明 | 网站大事 | 网站地图 | 意见建议
CopyRight 2005-2007 Jztop.Com 版权所有 未经许可 请勿转载