|
//把你舞台上的MC实例名放入数组,测试 var ballA:Array = [ball1, ball2, ball3, ball4, ball5]; //随机初始化每个MC的运动速度、方向、旋转 for (var i = 0; i<ballA.length; i++) { ballA[i].dx = 5*rand1_1(); ballA[i].dy = 5*rand1_1(); ballA[i].dr = 0;//增加旋转属性 ballA[i].N=i;//球编号 } //随机产生1或-1 function rand1_1():Number { return random(2) ? -1 : 1; } //舞台属性 Stage.scaleMode = "noScale"; Stage.align = "TL"; var sw:Number = Stage.width; var sh:Number = Stage.height; var stageListener:Object = new Object(); //舞台大小改变时,重置sw、sh stageListener.onResize = function() { sw = Stage.width; sh = Stage.height; }; Stage.addListener(stageListener); //------ onEnterFrame = function () { for (var i = 0; i<ballA.length; i++) { //如果到了边界,就反射 if (ballA[i]._x<ballA[i]._width/2 && ballA[i].dx<0) { ballA[i].dx *= -1; ballA[i].dr += ballA[i].dy; } if (ballA[i]._x>sw-ballA[i]._width/2 && ballA[i].dx>0) { ballA[i].dx *= -1; ballA[i].dr += -ballA[i].dy; } if (ballA[i]._y<ballA[i]._height/2 && ballA[i].dy<0) { ballA[i].dy *= -1; ballA[i].dr += -ballA[i].dx; } if (ballA[i]._y>sh-ballA[i]._height/2 && ballA[i].dy>0) { ballA[i].dy *= -1; ballA[i].dr += ballA[i].dx; } //检测所有MC之间是否有碰撞,有就根据情况改变“增量”方向 for (var j = i+1; j<ballA.length; j++) { if (myHitTest(ballA[i],ballA[j])) { //if (ballA[i].hitTest(ballA[j])) { mc12(ballA[i], ballA[j]); ballA[i]._x += ballA[i].dx; ballA[j]._x += ballA[j].dx; ballA[i]._y += ballA[i].dy; ballA[j]._y += ballA[j].dy; } } //移动一个“增量” ballA[i]._x += ballA[i].dx; ballA[i]._y += ballA[i].dy; ballA[i]._rotation += ballA[i].dr; ballA[i].dr -= ballA[i].dr*0.01; } }; //碰撞函数,根据两球碰撞方向和自身运动方向合成新的增量值 function mc12(mc1:MovieClip, mc2:MovieClip) { //碰撞角 var ang:Number = Math.atan2(mc2._y-mc1._y, mc2._x-mc1._x); //运动角 var ang1:Number = Math.atan2(mc1.dy, mc1.dx); var ang2:Number = Math.atan2(mc2.dy, mc2.dx); //反射角 var _ang1:Number = 2*ang-ang1-Math.PI; var _ang2:Number = 2*ang-ang2-Math.PI; //运动矢量 var r1:Number=Math.sqrt(mc1.dx*mc1.dx+mc1.dy*mc1.dy); var r2:Number=Math.sqrt(mc2.dx*mc2.dx+mc2.dy*mc2.dy); //碰撞矢量 var a1:Number = (mc1.dy/Math.sin(ang1))*Math.cos(ang-ang1); var a2:Number = (mc2.dy/Math.sin(ang2))*Math.cos(ang-ang2); //碰撞矢量合成 var dx1:Number = a1*Math.cos(ang)+a2*Math.cos(ang); var dy1:Number = a1*Math.sin(ang)+a2*Math.sin(ang); //旋转矢量,这里还有点问题,旋转方向有时不对。 mc1.dr += r1*Math.sin(ang-ang1); mc2.dr += r2*Math.sin(ang-ang2); //碰撞后的增量 mc1.dx = r1*Math.cos(_ang1)+dx1; mc1.dy = r1*Math.sin(_ang1)+dy1; mc2.dx = r2*Math.cos(_ang2)+dx1; mc2.dy = r2*Math.sin(_ang2)+dy1; } //碰撞侦测 function myHitTest(mc1:MovieClip,mc2:MovieClip):Boolean{ var a:Number=Math.sqrt((mc1._x-mc2._x)*(mc1._x-mc2._x)+(mc1._y-mc2._y)*(mc1._y-mc2._y)); if(a-2<=(mc1._width+mc2._width)/2){ return true; }else{ return false; } }
|