Здравствуйте.
Я сделал проверку (предпроверку) на касания окружностей созданного только что объекта с другими, созданными уже раньше. Если касания не происходит, то объект добавляется, если происходит, то создаются новые координаты и т.д.
Класс "Creation":
Код AS3:
package classes
{
import flash.utils.Timer;
import flash.events.TimerEvent;
import classes.fond.Fields;
import flash.display.Sprite;
public class Creation
{
private var timerCreation:Timer = new Timer(Settings.CREATION);
private var tempCreatedCrovel:int = 0;
public function Creation()
{
timerCreation.addEventListener(TimerEvent.TIMER,creationCrovels);
timerCreation.start();
}
private function creationCrovels(event:TimerEvent):void
{
trace("Создан Кровел");
tempCreatedCrovel += 1;
var crovel:Sprite = new Crovel(new Liquid());
var randomX:Number = Math.random() * Settings.SWEEP;
var randomY:Number = 50 + Math.random() * 500;
var randomCoordinates:Array = setRandomCoordinates(crovel);
randomX = randomCoordinates[0];
randomY = randomCoordinates[1];
crovel.x = randomX;
crovel.y = randomY;
Settings.crovels.push(crovel);
if(tempCreatedCrovel == Settings.NUMBERCROVEL)
{
timerCreation.removeEventListener(TimerEvent.TIMER,creationCrovels);
timerCreation.reset();
}
}
const LIMIT:int = 500;
private function setRandomCoordinates(ONECROVEL:Object,l:int = 1):Array
{
if(l >= LIMIT)
{
return [0,0];
}
var randomX:Number = Math.random() * Settings.SWEEP;
var randomY:Number = 50 + Math.random() * 500;
var areNewRandomCoordinates:Boolean = false;
const DATAONECROVEL:Object = new Object();
DATAONECROVEL.clip = ONECROVEL;
DATAONECROVEL.x = randomX;
DATAONECROVEL.y = randomY;
DATAONECROVEL.radius = (DATAONECROVEL.clip.width / 2) - Settings.REDUCTION;
for(var i:int = 0; i < Settings.crovels.length; i++)
{
const TWOCROVEL:Object = Settings.crovels[i];
const DATATWOCROVEL:Object = new Object();
DATATWOCROVEL.clip = TWOCROVEL;
DATATWOCROVEL.x = TWOCROVEL.x;
DATATWOCROVEL.y = TWOCROVEL.y;
DATATWOCROVEL.radius = (DATATWOCROVEL.clip.width / 2) - Settings.REDUCTION;
var are:Boolean = Collision.detectionCollision(DATAONECROVEL,DATATWOCROVEL);
if(are)
{
randomX = Math.random() * Settings.SWEEP;
randomY = 50 + Math.random() * 500;
DATAONECROVEL.x = randomX;
DATAONECROVEL.y = randomY;
}
else
{
areNewRandomCoordinates = true;
break;
}
}
if(!areNewRandomCoordinates)
{
return setRandomCoordinates(ONECROVEL,l+1);
}
return [randomX,randomY];
}
}
}
Статическая функция "detectionCollision":
Код AS3:
public static function detectionCollision(crovelOne:Object,crovelTwo:Object):Boolean
{
var xDiff:Number = crovelOne.x - crovelTwo.x;
var yDiff:Number = crovelOne.y - crovelTwo.y;
var distance = Math.sqrt(xDiff*xDiff+yDiff*yDiff);
if(distance <= crovelOne.radius + crovelTwo.radius)
{
return true;
}
return false;
}
Но погрешность иногда всё равно есть: