FLASH球形反弹as3代码解读
FLASH球形反弹as3代码解读:
var r:int = 120,arr:Array = [];//半径,,放小球的数组
this.graphics.lineStyle(2,0xcccccc);
graphics.drawCircle(275,200,r);
//在主时间轴背景上绘制大圆;
for (var i:int=0; i<10; i++)
{
var mc:MovieClip =new MovieClip();
//创建十个小球,内部运动
addChild(mc);
mc.graphics.beginGradientFill("radial",[0xffffff,0xff00ff*Math.random()],[1,1],[0,40]);
mc.graphics.drawCircle(0,0,15);
mc.r=(r-mc.width/2)*Math.random();//小球的r属性,记录的是它与它在大圆内与圆心的距离
var ang = Math.PI * 2 * Math.random();//360度随机
mc.x = 275 + mc.r * Math.cos(ang);
mc.y = 200 + mc.r * Math.sin(ang);//在大圆中心周围的一定范围内出现
mc.ang1 = Math.PI * 2 * Math.random();//ang1属性,用于表现运动方向
mc.m = 3 + 3 * Math.random();//m属性,是每个小球的运动速度
arr.push(mc);
//都放入数组;
}
addEventListener(Event.ENTER_FRAME ,frame);
function frame(e)
{
for (var i=0; i<arr.length; i++)
{
arr[i].x += arr[i].m * Math.cos(arr[i].ang1);
arr[i].y += arr[i].m * Math.sin(arr[i].ang1);//小球运动起来
arr[i].r=Math.sqrt((arr[i].x-275)*(arr[i].x-275)+(arr[i].y-200)*(arr[i].y-200));
//每帧重新获取它与大圆中心的距离
if (arr[i].r >= r - arr[i].width / 2)
{//当小球抵达大圆边界时
arr[i].ang2 = Math.atan2(200 - arr[i].y,275 - arr[i].x);//用ang2属性存入小球与大圆中心点的相对角度
arr[i].chaAng=arr[i].ang2-(Math.PI +arr[i].ang1);//角度差
arr[i].ang1 = arr[i].ang2 + arr[i].chaAng;//计算反弹角度,改变运动方向
arr[i].x=275+(r-arr[i].width/2)*Math.cos(Math.PI+arr[i].ang2);
arr[i].y=200+(r-arr[i].width/2)*Math.sin(Math.PI+arr[i].ang2);//用于校正边缘处的小球
}
}
}
//==================================大圆外的小球
var arr1:Array = [];
for (var j:int=0; j<int.MAX_VALUE; j++)
{//因为有条件限制,不知道什么情况下,可以生成足够的小球,所以用了最大值
var x1 = 25 + 500 * Math.random();
var y1 = 25 + 350 * Math.random();//舞台范围内
var L=Math.sqrt((x1-275)*(x1-275)+(y1-200)*(y1-200));//与舞台中心点的距离
if (L > r + 20)
{//与中心的距离要大于140
var mc1:MovieClip=new MovieClip();
addChild(mc1);
mc1.graphics.beginGradientFill("radial",[0xffffff,0xff0000],[1,1],[0,40]);
mc1.graphics.drawCircle(0,0,15);
mc1.x = x1,mc1.y = y1;
mc1.vx=(2+3*Math.random())*(int(Math.random()*2)*2-1);
mc1.vy=(2+3*Math.random())*(int(Math.random()*2)*2-1);//运动速度与方向
arr1.push(mc1);
}
if (arr1.length == 15)
{
break;//有15个小球符合条件后,退出循环
}
}
addEventListener(Event.ENTER_FRAME,frameB);
function frameB(e)
{
for (j=0; j<arr1.length; j++)
{
arr1[j].x0 = arr1[j].x;
arr1[j].y0 = arr1[j].y;
arr1[j].x = Math.min(Math.max(arr1[j].x + arr1[j].vx,arr1[j].width / 2),550 - arr1[j].width / 2);
arr1[j].y = Math.min(Math.max(arr1[j].y + arr1[j].vy,arr1[j].width / 2),400 - arr1[j].width / 2);//限制在舞台范围内,并运动起来
arr1[j].x == arr1[j].width / 2 || arr1[j].x == 550 - arr1[j].width / 2 ? arr1[j].vx *= -1:0;
arr1[j].y == arr1[j].width / 2 || arr1[j].y == 400 - arr1[j].width / 2 ? arr1[j].vy *= -1:0;//到达上下左右边界时,方向取反
arr1[j].r=Math.sqrt((arr1[j].x-275)*(arr1[j].x-275)+(arr1[j].y-200)*(arr1[j].y-200));//r属性存入与舞台中心点的距离
if (arr1[j].r <= r + arr1[j].width / 2)
{//接触到大圆时
arr1[j].ang2 = Math.atan2(arr1[j].y - 200,arr1[j].x - 275);//ang2属性存小球与舞台中心点的相对角度
arr1[j].ang1 = Math.atan2(arr1[j].y0 - arr1[j].y,arr1[j].x0 - arr1[j].x);//ang1属性存小球的运动角度
arr1[j].ang3=arr1[j].ang2+(arr1[j].ang2-arr1[j].ang1);//ang3属性存计算后的反弹角度
arr1[j].r1=Math.sqrt((arr1[j].x0-arr1[j].x)*(arr1[j].x0-arr1[j].x)+(arr1[j].y0-arr1[j].y)*(arr1[j].y0-arr1[j].y));//r1 属性存小球初始化的位置与当前位置的距离
/*arr1[j].x2 = arr1[j].x + arr1[j].r1 * Math.cos(arr1[j].ang3);
arr1[j].y2 = arr1[j].y + arr1[j].r1 * Math.sin(arr1[j].ang3);
arr1[j].vx = arr1[j].x2 - arr1[j].x;
arr1[j].vy = arr1[j].y2 - arr1[j].y;这四句与下面两句等效*/
arr1[j].vx = arr1[j].r1 * Math.cos(arr1[j].ang3);
arr1[j].vy = arr1[j].r1 * Math.sin(arr1[j].ang3);
//下面是为了防止临界晃动
arr1[j].x=275+(r+arr1[j].width/2)*Math.cos(arr1[j].ang2);
arr1[j].y=200+(r+arr1[j].width/2)*Math.sin(arr1[j].ang2);
}
}
}
没有评论 ▼