![ContractedBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![ExpandedBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
package
{
import flash.display.Sprite;
public class Ball extends Sprite
{
public var radius:Number;
public var color:uint;
public var vx:Number=0;
public var vy:Number=0;
public function Ball (radius:Number,color:uint)
{
this.radius=radius;
this.color=color;
Init ();
}
public function Init ():void
{
graphics.beginFill (color);
graphics.drawCircle (0,0,radius);
graphics.endFill ();
}
}
}
![ContractedBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![ExpandedBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
package
{
import flash.events.Event;
import flash.display.Sprite;
public class Bubbles2 extends Sprite
{
private var balls:Array;
private var bounce:Number=-0.1;
private var spring:Number=0.1;
private var gravity:Number=0.2;
private var numBalls:Number=30;
public function Bubbles2 ()
{
Init ();
}
private function Init ():void
{
balls=new Array();
for (var i:int=0; i<numBalls; i++)
{
var ball:Ball=new Ball(Math.random()*50+5,Math.random()*0xFFFFFF);
addChild (ball);
ball.x=Math.random()*stage.stageWidth;
ball.y=Math.random()*stage.stageHeight;
ball.vx=Math.random()*6-3;
ball.vy=Math.random()*6-3;
balls.push (ball);
}
addEventListener (Event.ENTER_FRAME,EnterFrame);
}
private function EnterFrame (e:Event):void
{
for (var i:int=0; i<numBalls-1; i++)
{
var ball0:Ball=balls[i];
for (var j:int=i+1; j<numBalls; j++)
{
var ball1:Ball=balls[j];
var dx:Number=ball1.x-ball0.x;
var dy:Number=ball1.y-ball0.y;
var dist:Number=Math.sqrt(dx*dx+dy*dy);
var minDist:Number=ball0.radius+ball1.radius;
if (dist<minDist)
{
var tx:Number=ball0.x+dx/dist*minDist;
var ty:Number=ball0.y+dy/dist*minDist;
var ax:Number=(tx-ball1.x)*spring;
var ay:Number=(ty-ball1.y)*spring;
ball0.vx-=ax;
ball0.vy-=ay;
ball1.vx+=ax;
ball1.vy+=ay;
}
}
}
for (var i:int=0; i<numBalls; i++)
{
var ball:Ball=balls[i];
Move (ball);
}
}
private function Move (ball:Ball):void
{
ball.vy+=gravity;
ball.x+=ball.vx;
ball.y+=ball.vy;
if (ball.x+ball.radius>stage.stageWidth)
{
ball.x=stage.stageWidth-ball.radius;
ball.vx*=bounce;
}
else if (ball.x-ball.radius<0)
{
ball.x=ball.radius;
ball.vx*=bounce;
}
if (ball.y+ball.radius>stage.stageHeight)
{
ball.y=stage.stageHeight-ball.radius;
ball.vy*=bounce;
}
else if (ball.y-ball.radius<0)
{
ball.y=ball.radius;
ball.vy*=bounce;
}
}
}
}
----------------------------------------------------------------------------------------------------
碰撞算法优化
多个精灵进行碰撞的一般算法:
sprite1 with sprite2 sprite3 sprite4 sprite5 sprite6 sprite7 sprite8 sprite2 with sprite1 sprite3 sprite4 sprite5 sprite6 sprite7 sprite8 sprite3 with sprite2 sprite1 sprite4 sprite5 sprite6 sprite7 sprite8 sprite4 with sprite2 sprite3 sprite1 sprite5 sprite6 sprite7 sprite8 sprite5 with sprite2 sprite3 sprite4 sprite1 sprite6 sprite7 sprite8 sprite6 with sprite2 sprite3 sprite4 sprite5 sprite1 sprite7 sprite8 sprite7 with sprite2 sprite3 sprite4 sprite5 sprite6 sprite1 sprite8 sprite8 with sprite2 sprite3 sprite4 sprite5 sprite6 sprite7 sprite1
精简算法:
sprite1 with sprite2 sprite3 sprite4 sprite5 sprite6 sprite7 sprite8 sprite2 with sprite3 sprite4 sprite5 sprite6 sprite7 sprite8 sprite3 with sprite4 sprite5 sprite6 sprite7 sprite8 sprite4 with sprite5 sprite6 sprite7 sprite8 sprite5 with sprite6 sprite7 sprite8 sprite6 with sprite7 sprite8 sprite7 with sprite8 sprite8 with nothing