多目标点弹性模拟
1.构建小球精灵(弹性小球)

Ball.as
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 ();
}
}
}
2. 构建正方形精灵(可以拖动的手柄)

Rect.as
package
{
import flash.display.Sprite;
public class Rect extends Sprite
{
public function Rect (r_width:Number,r_color:uint)
{
graphics.beginFill (r_color);
graphics.drawRect (0,0,r_width,r_width);
graphics.endFill ();
}
}
}
3.构建多目标弹性动画

MultiSpring.as
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
public class MultiSpring extends Sprite
{
private var ball:Ball;
private var handles:Array;
private var numHandles:Number=3;
private var friction:Number=0.8;
private var spring:Number=0.2;
private var handleWidth:Number=10;
public function MultiSpring ()
{
Init ();
}
private function Init ():void
{
ball=new Ball(20,0xFF0000);
addChild (ball);
handles=new Array();
for (var i:int=0; i<numHandles; i++)
{
var handle:Rect=new Rect(handleWidth,0xFFFF00);
handle.x=Math.random()*stage.stageWidth;
handle.y=Math.random()*stage.stageHeight;
handle.addEventListener (MouseEvent.MOUSE_DOWN,MouseDown);
addChild (handle);
handles.push (handle);
}
addEventListener (Event.ENTER_FRAME,EnterFrame);
}
private function MouseDown (e:MouseEvent):void
{
e.target.addEventListener (MouseEvent.MOUSE_UP,MouseUp);
e.target.startDrag ();
}
private function MouseUp (e:MouseEvent):void
{
e.target.removeEventListener (MouseEvent.MOUSE_UP,MouseUp);
e.target.stopDrag ();
}
private function EnterFrame (e:Event):void
{
for (var i:int=0; i<numHandles; i++)
{
var dx:Number=handles[i].x-ball.x;
var dy:Number=handles[i].y-ball.y;
ball.vx+=dx*spring;
ball.vy+=dy*spring;
}
ball.vx*=friction;
ball.vy*=friction;
ball.x+=ball.vx;
ball.y+=ball.vy;
graphics.clear ();
graphics.lineStyle (1);
for (var j:int=0; j<numHandles; j++)
{
graphics.moveTo (ball.x,ball.y);
graphics.lineTo (handles[j].x+handleWidth/2,handles[j].y+handleWidth/2);
}
}
}
}
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 ();
}
}
}
package
{
import flash.display.Sprite;
public class Rect extends Sprite
{
public function Rect (r_width:Number,r_color:uint)
{
graphics.beginFill (r_color);
graphics.drawRect (0,0,r_width,r_width);
graphics.endFill ();
}
}
}
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
public class MultiSpring extends Sprite
{
private var ball:Ball;
private var handles:Array;
private var numHandles:Number=3;
private var friction:Number=0.8;
private var spring:Number=0.2;
private var handleWidth:Number=10;
public function MultiSpring ()
{
Init ();
}
private function Init ():void
{
ball=new Ball(20,0xFF0000);
addChild (ball);
handles=new Array();
for (var i:int=0; i<numHandles; i++)
{
var handle:Rect=new Rect(handleWidth,0xFFFF00);
handle.x=Math.random()*stage.stageWidth;
handle.y=Math.random()*stage.stageHeight;
handle.addEventListener (MouseEvent.MOUSE_DOWN,MouseDown);
addChild (handle);
handles.push (handle);
}
addEventListener (Event.ENTER_FRAME,EnterFrame);
}
private function MouseDown (e:MouseEvent):void
{
e.target.addEventListener (MouseEvent.MOUSE_UP,MouseUp);
e.target.startDrag ();
}
private function MouseUp (e:MouseEvent):void
{
e.target.removeEventListener (MouseEvent.MOUSE_UP,MouseUp);
e.target.stopDrag ();
}
private function EnterFrame (e:Event):void
{
for (var i:int=0; i<numHandles; i++)
{
var dx:Number=handles[i].x-ball.x;
var dy:Number=handles[i].y-ball.y;
ball.vx+=dx*spring;
ball.vy+=dy*spring;
}
ball.vx*=friction;
ball.vy*=friction;
ball.x+=ball.vx;
ball.y+=ball.vy;
graphics.clear ();
graphics.lineStyle (1);
for (var j:int=0; j<numHandles; j++)
{
graphics.moveTo (ball.x,ball.y);
graphics.lineTo (handles[j].x+handleWidth/2,handles[j].y+handleWidth/2);
}
}
}
}

浙公网安备 33010602011771号