2017-01-25 16 views
0

Мне удалось сделать эту работу и сделать то, что мне нужно через некоторое время, но теперь моя проблема - это производительность. Как вы можете видеть, мне нужно это для 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}); 
     } 
    } 
+0

В зависимости от того, насколько велики спринты, которые генерируются, и насколько велика эта сцена, это может привести к реальному замедлению, потому что, если для последнего спрайта доступно только 1 место, это может занять много времени случайно найти это пятно. Лучшим подходом было бы иметь сдержанные области, в которые Sprite может быть помещен (и задан случайный сдвиг, который удерживает его в пределах этой скрытой области), а затем удаляет эту область из списка возможных случайных мест, чтобы поставить следующий спрайт в. смысл? –

+0

Таким образом, вы произвольно выбираете только 23 оставшихся пятна, а затем 22 оставшихся пятна, а не 12 пятен, которые уже были использованы, поэтому вам не нужно «проверять, сталкиваются ли они с чем-либо», потому что они никогда не будут с этой техникой. Теперь недостатком этого является то, что он не является случайным, но если вам нужно, чтобы он был полностью случайным, вы столкнулись с той же проблемой. –

+0

Только что увидел вашу заметку о решении сетки (которое принадлежит мне). Сожалею. –

ответ

0

У меня есть пара идей

  1. Случайное смещение для заполнения возможных мест

сделать массив точек, и каждая точка смещена от previou на минимальную сумму, необходимую для предотвращения столкновения с объектом, который помещен в эту точку. Тогда у вас будет этот хороший массив точек, и вы можете случайно выбрать, и ни один из них не будет перекрываться.

Это идея в любом случае. Сделайте это для смещения x. Тогда для y offset вам придется сделать еще несколько обманов, которые я еще не понял.

+0

Позднее, когда у меня есть время. –

+0

Thx для ответа. На данный момент я решил иметь несколько определенных областей, и все в порядке. Проблема, с которой я сталкиваюсь сейчас, связана с анимацией, когда вы показываете все из них одновременно. Если у вас есть идея по этому поводу, это будет высоко оценено. –

0

Как и Нил Дэвис, узким местом, вероятно, является функция checkAllCollision, которая вызывается снова и снова. Еще несколько оптимизаций, которые я могу придумать:

  1. У вас есть мувиклипы A и B и петля через все их. Вы проверяете, сталкивается ли A с B. Затем вы проверяете, снова ли B сталкивается с A (вы уже проверили это на предыдущем шаге). Поэтому может быть хорошей идеей вспомнить, какие комбинации MC уже были проверены, чтобы не проверять ее снова наоборот. Может быть, некоторые хеш-таблицы для этого?

  2. Ваше обнаружение столкновения, по-видимому, проверяет сложные формы, и оно очень медленно. Может быть, лучше, если вы быстро проверите, сталкивается ли ограничивающий прямоугольник (это должно быть намного быстрее), и, если это необходимо, проверьте, проверив сложную форму.

+0

1. Мне нужно его снова проверить, потому что, поскольку повторное позиционирование случайное, мне нужно его проверить, не помещено ли оно на элемент, который я уже проверил :( 2. Что касается комплексной проверки, у меня есть объекты, которые имеют неправильные формы, а иногда простая проверка не работает должным образом. –

+0

И я думаю, что я попытаюсь использовать другой подход к этой проблеме и немного изменить идею, которую я имел в виду. –

+0

@ AlexandruBalea, то, что он говорит, сначала запустите проверку рамки, потому что, если ящики не сталкиваются, то мы знаем, что сложные формы не являются (и проверка ограничивающей рамки - это путь дешевле сложного изображения), то, если ограничивающая рамка действительно сталкивается, тогда вы проверяете комплекс (который может не столкнуться в конце концов). Это купит вам некоторую скорость, но будет ли она вам достаточно покупать, будет зависеть от ваших потребностей и количества объектов, которые вам нужны в конце. Не стесняйтесь загружать экран sho t всех объектов на сцене. –