Показать сообщение отдельно
Старый 02.12.2008, 17:46
goarcade вне форума Посмотреть профиль Отправить личное сообщение для goarcade Найти все сообщения от goarcade
  № 6  
Ответить с цитированием
goarcade

Регистрация: Sep 2006
Сообщений: 32
Не поленился и набросал код моего подхода, т.к. задача показалась интересной надеюсь он будет полезным!

Код AS1/AS2:
import flash.geom.Point; 
 
 
var ballList:Array = new Array();
 
for(var i:Number=0;i<100;i++)
{
	var w:Number = 550;
	var h:Number = 400;
	ballList.push(createBall(w/10*(i%10)+w/20,h/10*Math.floor(i/10)+h/20));
}
 
function onEnterFrame():Void
{
	for(var i:Number=0;i<ballList.length;i++)
	{
		steer(ballList[i]);
		if(ballList[i].position.subtract(ballList[i].target).length<10)
		{
			createTarget(ballList[i],20);
		}
	}
}
 
 
function steer(mc:MovieClip):Void
{
	var target:Point = mc.target;
	var position:Point = mc.position;
	var velocity:Point = mc.velocity;
 
	var max_speed:Number = mc.max_speed;
 
	var target_offset:Point = target.subtract(position)
	var ramped_speed:Number = max_speed * (target_offset.length/10)
	var clipped_speed:Number = Math.min(ramped_speed, max_speed)
	var desired_velocity:Point =  target_offset.clone();
	desired_velocity.normalize(desired_velocity.length*(clipped_speed / target_offset.length));
 
 
	velocity = mc.velocity.add(truncate (desired_velocity.subtract(velocity), 0.5));
	truncate (velocity, max_speed)
 
 
	position = position.add(velocity);
 
	mc._x = position.x;
	mc._y = position.y;	
	mc.position = position;
	mc.velocity = velocity;	
}
function createBall(x:Number,y:Number):MovieClip
{
	var mc:MovieClip = createEmptyMovieClip("ball"+getNextHighestDepth(),getNextHighestDepth());
	mc.beginFill(0xffffff*Math.random());
	drawRect(mc,5);
	mc.endFill();
 
	mc._x = x;
	mc._y = y;
 
	mc.position0 = new Point(x,y);	
	mc.position = new Point(x,y);
	mc.target = new Point(x,y);
	mc.velocity = new Point(0,0);
	mc.max_speed = 3;
	return mc;
}
 
 
function createTarget(mc:MovieClip,r:Number):Void
{
	mc.target = new Point(mc.position0.x+Math.random()*r-r/2,mc.position0.y+Math.random()*r-r/2);
}
 
 
function truncate(p:Point,maxLength:Number):Point
{
	if(p.length>maxLength)p.normalize(maxLength);
	return p;
} 
 
function drawRect(mc:MovieClip, r:Number):Void {
	mc.moveTo(-r,-r);
	mc.lineTo( r,-r);
	mc.lineTo( r, r);	
	mc.lineTo(-r, r);	
}