Мне удалось сделать эту работу и сделать то, что мне нужно через некоторое время, но теперь моя проблема - это производительность. Как вы можете видеть, мне нужно это для 14 предметов. Сначала я тестировал 5 элементов, и он работал нормально, но после того, как я добавил больше, производительность сильно снизилась. Что касается класса обнаружения столкновений, я предполагаю, что вы знаете, что он делает и как он работает (мне удалось заставить его работать, так как точка регистрации работает только при установке в левую верхнюю часть клипа, а моя была посередине) Если вам нужны какие-либо другие данные или информация, пожалуйста, не стесняйтесь спрашивать, и я постараюсь изо всех сил предоставить его. Так в нескольких словах, что нужно: -У меня проблемы с производительностью с кодом, который я использую для обнаружения столкновения между элементами
- У меня есть 14+ объекты и нужно вывести их
- Мне нужно уникальное случайное положение для каждого объекта
- сделать новое случайное положение и проверка чтобы увидеть, если это форма сталкивается с другими объектами
- Если объект не конфликтует с другим объектом отображается мувиклипе
- Если объект сталкивается с другим MovieClip получить другую случайную позицию
- Проверьте снова объект с другими объектами, чтобы увидеть, если он сталкивается
- Если ДА найти другую позицию/Если НЕТ показать объект
- Сделайте это, пока все объекты не расположены, не сталкиваясь друг с другом
Я считаю, что я что-то упустил и что этот код может быть лучше, но на самом деле не имеет никаких других хороших идей и не нашел ничего в Интернете, которое могло бы помочь. Пожалуйста, дайте мне руку.
*** Кроме того, имейте в виду, что я не хочу, решение сетки для обнаружения столкновений
private var objArray : Array = new Array (movieClip1, movieClip2, movieClip3, movieClip4, movieClip5, movieClip6, movieClip7, movieClip8, movieClip9, movieClip10, movieClip11, movieClip12, movieClip13, movieClip14);
private function init():void
{
trace("[TRACE]:Init GameScreen");
addEvents();
startTimerCollision();
}
private function addEvents():void
{
_timer.addEventListener(TimerEvent.TIMER, timer); //Listen for the Timer event _timer and trigger the function timeLeft.
Repository.STAGE_REF.addEventListener(Event.ENTER_FRAME, frameRate);
}
private function startTimerCollision():void
{
_timer.start(); //start the timer
_collisionCheck = new CollisionTest();
}
private function frameRate(event:Event):void
{
//add 1 to the frame count every frame
_frame++;
}
function timer(event:TimerEvent):void
{
timpul--
_TimerSound.play();
showObjs();
}
private function randomPosition(obj:MovieClip):void
{
obj.x = obj.width + Math.random() * (stage.stageWidth - obj.width * 2);
obj.y = obj.height + Math.random() * (stage.stageHeight - obj.height * 2);
// trace(obj + " RANDOM POS= " + "x: " + obj.x + "/y:" + obj.y);
}
private function randomALLPositions():void
{
for (var i = 0; i < objArray.length; i++)
{
randomPosition(objArray[i]);
}
}
private function checkAllCollision(obj:MovieClip):Boolean
{
var collisionStatus : Boolean;
for (var i = 0; i < objArray.length; i++)
{
if (obj != objArray[i])
{
if (_collisionCheck.complex(obj, objArray[i]))
{
collisionStatus = true;
// trace("collision detected: " + obj + " and " + objArray[i]);
randomPosition(obj);
checkAllCollision(obj);
}
else
{
collisionStatus = false;
}
}
}
return collisionStatus;
}
private function showObjs():void
{
////////////////////////////////////////////////////////ONLINE
var i:int = 0;
var j:int;
var l:int = objArray.length;
for (i; i < l; i++)
{
randomPosition(objArray[i]);
for (j = 0; j < l; j++)
{
if (objArray[i] != objArray[j])
{
// trace("OBJ " + (i+1) + " with OBJ " + (j+1) + "---------> CHECKING");
//while (checkAllCollision(objArray[i]))
if(checkAllCollision(objArray[i]) == true)
{
// trace("OBJ " + (i+1) + " with OBJ " + (j+1) + "---------> Collision DETECTED");
randomPosition(objArray[i]);
// trace("OBJ "+ (i+1) + " NOW= " + "x: " + objArray[i].x + "/y:" + objArray[i].y);
}
// trace("OBJ " + (i+1) + " with OBJ " + (j+1) + "---------> OK");
}
}
addChild(objArray[i]);
}
////////////////////////////////////////////////////////ONLINE
for (var z = 0; z < objArray.length; z++)
{
TweenLite.to(objArray[z]["gime" + (z+1)], /*time:*/ 0, {scaleX:0, scaleY: 0});
TweenLite.to(objArray[z]["gime" + (z+1)], /*time:*/ 0.5, {scaleX:1, scaleY: 1});
}
}
В зависимости от того, насколько велики спринты, которые генерируются, и насколько велика эта сцена, это может привести к реальному замедлению, потому что, если для последнего спрайта доступно только 1 место, это может занять много времени случайно найти это пятно. Лучшим подходом было бы иметь сдержанные области, в которые Sprite может быть помещен (и задан случайный сдвиг, который удерживает его в пределах этой скрытой области), а затем удаляет эту область из списка возможных случайных мест, чтобы поставить следующий спрайт в. смысл? –
Таким образом, вы произвольно выбираете только 23 оставшихся пятна, а затем 22 оставшихся пятна, а не 12 пятен, которые уже были использованы, поэтому вам не нужно «проверять, сталкиваются ли они с чем-либо», потому что они никогда не будут с этой техникой. Теперь недостатком этого является то, что он не является случайным, но если вам нужно, чтобы он был полностью случайным, вы столкнулись с той же проблемой. –
Только что увидел вашу заметку о решении сетки (которое принадлежит мне). Сожалею. –