关于多球碰撞 |
| 作者:佚名 来源:闪吧 作者: czbs 更新:2007-1-13 20:47:04 错误报告 我要投稿 |
点击浏览该文件
前天刚来的时候发了个两球想碰的,后来将其改得更为普遍可用,就可以实现多球的碰撞了。 *诗意制造多球的碰撞问题
_global.ball=function(xposition,yposition,vx,vy,holder_mc){//创建BALL类 this.vx=vx;//速度 this.vy=vy;// this.holder=holder_mc;//所在的MOVIECLIP this.holder._x=xposition;//定义MOVIECLIP的位置 this.holder._y=yposition; this.fixV=Math.sqrt(vx*vx+vy*vy)//合成的速度 }; ////////////////////////////////////// ball.prototype.move=function(){//球移动的方法 this.pengbi();//检验是否碰壁 this.holder._x+=this.vx; this.holder._y+=this.vy; }; ball.prototype.pengbi=function(){//碰壁的判断 if(this.holder._x>340 or this.holder._x<52){this.vx*=-1}; if(this.holder._y>225 or this.holder._y<75) {this.vy*=-1}; }; ball.prototype.ballcrash=function(v){//球碰球的方法 var disX=this.holder._x-v.holder._x; var disY=this.holder._y-v.holder._y; var distance=Math.distance(disX,disY); /////////求距离 var angle=Math.round (Math.atan2D(disY,disX));//求两球与X轴的夹角 var Vangle1=Math.atan2D(this.vy,this.vx);//球一速度的角度 var Vangle2=Math.atan2D(v.vy,v.vx);//球二速度的角度 var angleBetween2 =Math.chaToFlashAngle(Vangle2-angle);//求球二的速度方向和两球连线方向的交角 var angleBetween1 =Math.chaToFlashAngle(Vangle1-angle);//求球二的速度方向和两球连线方向的交角 ///////////////////////////////////// var Vx1=this.fixV*Math.cosD(angleBetween1);//将速度以连线方向和垂直连线方向做速度的分解 var Vy1=this.fixV*Math.sinD(angleBetween1);
var Vx2=v.fixV*Math.cosD(angleBetween2);//将速度以连线方向和垂直连线方向做速度的分解 var Vy2=v.fixV*Math.sinD(angleBetween2); //////////////////////////////////// if((distance*distance)<1600){ var temp1=Vx1; Vx1=Vx2; Vx2=temp1; /////////交换碰撞方向上的速度 this.vx=Vx1*Math.cosD(angle)+Vy1*Math.cosD(angle+90); this.vy=Vx1*Math.sinD(angle)+Vy1*Math.cosD(angle); v.vx=Vx2*Math.cosD(angle)+Vy2*Math.cosD(angle+90); v.vy=Vx2*Math.sinD(angle)+Vy2*Math.cosD(angle); /////////从新合成速度 this.fixV=Math.sqrt(this.vx*this.vx+this.vy*this.vy); v.fixV=Math.sqrt(v.vx*v.vx+v.vy*v.vy); /////////更新速度合成 }; }; Math.atan2D=function(disY,disX){/////给MATH加一个能直接算角度的方法 var angle=Math.atan2(-disY,disX)*(180/Math.PI); angle*=-1; return Math.chaToFlashAngle(angle); }; Math.chaToFlashAngle=function(angle){/////给MATH加一个将笛卡尔坐标转成FLASH坐标的方法 angle%=360; if(angle<0){ return angle+360;} else{ return angle ;} }; Math.distance=function(disX,disY){////////给MATH加一个能直接算距离的方法 return Math.sqrt(disX*disX+disY*disY); }; Math.sinD=function(angle){////////////////改造SIN方法 return Math.sin(angle*(Math.PI/180)); }; Math.cosD=function(angle){////////////////改造COS方法 return Math.cos(angle*(Math.PI/180)); }; ////////////////////////////////////// ///////////////////////////////////// ball1=new ball(100,200,2,2,mc1);//生成实例 ball2=new ball(100,100,3.5,3.5,mc2);//生成实例 ball3=new ball(300,200,3,3,mc3);//生成实例 ball4=new ball(300,150,1,1,mc4);//生成实例 //////////////////////////////////// ///////////球的运动////////////////// _root.mc1.onEnterFrame=function(){ ball1.ballcrash(ball2); ball1.ballcrash(ball3); ball1.move(); }; _root.mc2.onEnterFrame=function(){ ball2.ballcrash(ball3); ball2.ballcrash(ball4); ball2.move(); }; _root.mc3.onEnterFrame=function(){ ball3.ballcrash(ball4); ball3.move(); }; _root.mc4.onEnterFrame=function(){ ball4.ballcrash(ball1); ball4.move(); };
点击浏览该文件
|
|
| 文章录入:skyuu 责任编辑:skyuu |
|
| 【字体:小 大】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 |