2012-05-16 7 views
0

В настоящее время я пишу игру для Android, и я имею дело с быстрым обнаружением столкновения. У меня появилось решение, но я хотел бы узнать наиболее подходящий способ сделать это.Быстрое обнаружение столкновений

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

Это игровой объект, который проверяет, были ли лазеры игрока или если игрок сам столкнулся с ним.

public void update(PlayerDroid[] holderPlayerDroid) { 
      // Update the location 
      //y = y + velocity; 
      //stupidBadDroidPositionShape.setLocation(this.x, this.y); 

      // Updates regarding interactions with the enemy out of the StupidBadDroids perspective, which is the PlayeDroid 
      for(int numberOfPlayerDroid = 0; numberOfPlayerDroid < holderPlayerDroid.length; numberOfPlayerDroid++) { 
       // Check if the StupidBadDroid got hit 
       for(int iterations = 0; iterations < velocity; iterations++) { 
        y = y + 1; 
        stupidBadDroidPositionShape.setLocation(this.x, this.y); 
        // Check if StupidBadDroid collides with the enemy (which is the player) 
        if(Physics.shapeInShape(holderPlayerDroid[numberOfPlayerDroid].getPlayerPositionShape(), getPlayerPositionShape())) { 
         isDead = true; 
        } 
        for(int i = 0; i < holderPlayerDroid[numberOfPlayerDroid].amountOfVisibleLasers; i++) { 
         if(holderPlayerDroid[numberOfPlayerDroid].holderLaser[i].isDisposed() == false) { 
          if(Physics.shapeInShape(holderPlayerDroid[numberOfPlayerDroid].holderLaser[i].getLaserPositionShape(), getPlayerPositionShape())) { 
           isDead = true; 
           holderPlayerDroid[numberOfPlayerDroid].holderLaser[i].dispose(); 
          } 
         } 

        } 
       } 



      } 

    } 

Этот способ является очень требовательным к ЦП. Вы считаете, что есть лучшее решение, которое я мог бы применить?

+0

почему вы итерация скорости? Я получаю большую часть вашего кода, просто не эту часть – Denzil

+0

Эй, Дензил, я делаю это, чтобы проверить, действительно ли лазер поражает врага. Лазер маленький, а иногда просто пролетает сквозь врага. Метод, который я использовал ранее, заключался в том, чтобы проверять любые столкновения каждый раз, когда лазер добавлял 8 к его расстоянию. Но теперь я позволяю ему путешествовать 1, затем проверять наличие столкновений, затем снова и снова, пока не достигнет 8 (это его скорость), а затем я его визуализирую. Имеет ли это смысл? –

+1

Вы всегда можете использовать геометрические ограничивающие прямоугольники/фигуры для своих объектов и вычислять время/положение, в котором происходит столкновение. Для более детального изучения может потребоваться дополнительная информация об объектах. – Darthfett

ответ

0

Вы описываете туннелирование и пытаетесь выполнять непрерывное обнаружение столкновений. Ваш метод имеет интенсивность процессора, потому что вы пытаетесь перенаправить решение.

Чем больше точность вы хотите, тем более техническое решение. Если вам не нужна большая верность, вы можете предположить, что путь, который объекты берут в каждом кадре, является линейным и «расширяет» ваши хит-боксы, чтобы покрыть все расстояние, перемещенное объектами во время кадра. Например, вместо того, чтобы перемещать каждую точку на дискретное расстояние за раз, вы можете просто расширить точки на сегмент линии и посмотреть, пересекаются ли они. Тем не менее, ваши hitboxes не будут точками, поэтому просто «растяните» их по длине пути. Это очень малое решение - если происходит несколько столкновений на одном и том же объекте, вы не всегда сможете выбрать столкновение, которое произошло «первым».

Для очень сложных решений, попробуйте -

http://www.bulletphysics.org/mediawiki-1.5.8/index.php/Collision_Detection_and_Physics_FAQ

Смежные вопросы