package { import flash.display.Sprite; import flash.events.Event; import flash.geom.Point; public class MultiBilliard extends Sprite { private var balls:Array; private var numBalls:uint=8; private var bounce:Number=-1.0; public function MultiBilliard() { init(); } private function init():void { balls = new Array(); for (var i:uint = 0; i < numBalls; i++) { var radius:Number=Math.random()*40+10; var ball:Ball=new Ball(radius,Math.random()*0xffffff); ball.mass=radius; ball.x=i*100; ball.y=i*50; ball.vx=Math.random()*10-5; ball.vy=Math.random()*10-5; addChild(ball); balls.push(ball); } addEventListener(Event.ENTER_FRAME, onEnterFrame); } private function onEnterFrame(event:Event):void { for (var i:uint = 0; i < numBalls; i++) { var ball:Ball=balls[i]; ball.x+=ball.vx; ball.y+=ball.vy; checkWalls(ball); } for (i = 0; i < numBalls - 1; i++) { var ballA:Ball=balls[i]; for (var j:Number = i + 1; j < numBalls; j++) { var ballB:Ball=balls[j]; checkCollision(ballA, ballB); } } } //舞台边界检测 function checkWalls(b:Ball) { if (b.xstage.stageWidth-b.radius) { b.x=stage.stageWidth-b.radius; b.vx*=bounce; } if (b.ystage.stageHeight-b.radius) { b.y=stage.stageHeight-b.radius; b.vy*=bounce; } } private function rotate(x:Number, y:Number, sin:Number, cos:Number, reverse:Boolean):Point { var result:Point = new Point(); if (reverse) { result.x=x*cos+y*sin; result.y=y*cos-x*sin; } else { result.x=x*cos-y*sin; result.y=y*cos+x*sin; } return result; } private function checkCollision(ball0:Ball, ball1:Ball):void { var dx:Number=ball1.x-ball0.x; var dy:Number=ball1.y-ball0.y; var dist:Number=Math.sqrt(dx*dx+dy*dy); if (dist