2015-03-06 4 views
1

У меня проблемы с стрельбой персонажа. Когда SPACE кнопка нажата стрельба персонажа одна пуля. Но когда я нажимаю SPACE, например, дважды я должен был выстрелить двумя пулями из своего персонажа. К сожалению, в то время у меня была только одна пуля, и когда моя пуля сталкивается с чем-то (например, стена), только тогда стреляет вторая вторая пуля! Я понимаю, что ArrayList обновляет только одну марку в то время и когда эта пуля удаляется, а затем обновляйте другую. Как мне нужно получить двойной эффект (или даже больше) Bullets?Съемка более чем одной пули

Вот мой класс игрока

public class CoolGuy extends GameObject{ 
     private ArrayList<PlayerBullet> bullets; 
     /*Tones of code here */ 
    public void shoot(float delta){ 
     if(PlayerBullet.shoot){ 
      if(index != 0){ 
       index++; 
      } 
      bullets.add(new PlayerBullet(full.x, full.y + sprite.getHeight()/2 - 30)); 
     } 
    } 
    public void update(float delta) { 
     if(bullets.size() > 0){ 
      if(bullets.get(index) != null){ 
       bullets.get(index).update(delta); 
      } 
      for(GameObject t : list){ 
       if(t instanceof Brick){ 
        if(bullets.size() > 0 && bullets.get(index) != null && bullets.get(index).hits(t.getHitBox()) == 1){ 
         bullets.remove(index); 
        } 
       } 
      } 
     } 
    } 
} 

А вот мой пуля класс

public class PlayerBullet extends ItemObject{ 
    private Sprite sprite; 
    private Rectangle full; 
    public static boolean shoot; 

    public PlayerBullet(int x, int y){ 
     ...... 
     ...... 
    } 
    public int hits(Rectangle r) { 
     if(full.overlaps(r)){ 
      return 1; 
     } 
     return -1; 
    } 
    public void update(float delta) { 
     full.x += (delta * 500); 
     setPosition(full.x,full.y); 
    } 
} 

А вот в моем главном классе

player1.update(Gdx.graphics.getDeltaTime()); 

    if(Gdx.input.isKeyJustPressed(Input.Keys.SPACE)){ 
     player1.shoot(Gdx.graphics.getDeltaTime()); 
    } 
+0

Ваш метод 'update' должен начинаться с чего-то вроде' for (Bullet b: bullets) b.update (delta); '. (Только комментарий, а не ответ, потому что никто не может знать, что ... не так с вашим кодом ...) – Marco13

+0

Если вы не можете понять, почему это происходит, вам будет очень сложно помочь вам. – CaffeineToCode

+1

Вы обновляете только одну пулю, которая находится в «индексе». Создайте цикл for, чтобы просмотреть все записи в ArrayList и вызвать update() для каждого из них. –

ответ

2

Я не могу сказать, что ваш параметр index (материал, который вы делаете с ним, не имеет для меня никакого смысла), но, похоже, это похоже на b e - источник проблемы.

Прежде всего, в методе shoot вы только увеличиваете его, если он отличен от нуля, поэтому, если он равен нулю, он навсегда будет равен нулю.

Затем в render вы обновляете только одну пулю вместо всех пуль в массиве.

Самое ясное решение для меня (хотя опять я не знаю, что вы пытались отслеживать с помощью параметра index) было бы полностью удалить параметр index. Затем замените ArrayList на класс Array от libgdx, который позволяет быстро изменять и удалять в течение цикла и изменять метод визуализации следующим образом.

public void update(float delta) { 
    for (int i=bullets.size-1; i>=0; i--) { //count backward for safe removals 
     PlayerBullet bullet = bullets.get(i); 
     for(GameObject t : list){ 
      if(t instanceof Brick){ 
       if(bullet.hits(t.getHitBox()) == 1){ 
        bullets.removeIndex(i); 
       } 
      } 
     } 
    } 
} 
Смежные вопросы