2014-02-02 2 views
1

Я делаю шутер с LibGDX. Мой код работает, когда одна пуля попадает в одного врага. Когда несколько врагов сложены и поле столкновения пули попадает несколько ящиков противника столкновения, игра вылетает с Exception в потоке «LWJGL Application» java.lang.ArrayIndexOutOfBoundsException: -1LibGDX Создание единственной пули убивает только одного врага, когда враги перекрываются

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

Мой вопрос: Как изменить петлю/код так, чтобы один враг умирал с одной пулей, даже если есть много врагов, «уложенных», и пуля поражает сразу нескольких врагов. Спасибо.

bIter = bullets.iterator(); 
     while(bIter.hasNext()){ 
      b = bIter.next();   
      mIter = monsters.iterator(); 
      while(mIter.hasNext()){ 
       m = mIter.next(); 

       if(m.getBounds().overlaps(b.getBounds())){ 

        mIter.remove(); 
        bIter.remove(); 

       } 
      } 
     } 

ответ

4

Помогает ли вам добавить перерыв? Он остановит цикл, как только одна пуля ударит по врагу. Оба удаляются (но только один враг), и мы начинаем со следующей пули.

bIter = bullets.iterator(); 
while(bIter.hasNext()){ 
    b = bIter.next();   
    mIter = monsters.iterator(); 
    while(mIter.hasNext()){ 
     m = mIter.next(); 
     if(m.getBounds().overlaps(b.getBounds())){ 
      mIter.remove(); 
      bIter.remove(); 
      break; // <-- this is new 
     } 
    } 
} 
+0

Хорошо, но Да. Еще раз спасибо. Я временно исправил это с добавлением небольшого таймера в цикл, но это более тонкое и эффективное решение. –

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