射击不止一颗子弹

时间:2015-03-06 23:49:20

标签: java libgdx

我的角色拍摄有问题。当按下 SPACE 按钮时,角色会射击一颗子弹。但是当我按下 SPACE 两次时,我应该从我的角色中射出两颗子弹。不幸的是,我当时只得到一颗子弹,当我的子弹碰撞某些物体(例如墙壁)时,只有其他第二颗子弹射击!我理解比ArrayList当时只更新一个项目符号,当该项目符号被删除时更新另一项项目符号。我需要如何获得双重(甚至更多)子弹效果?

这是我的Player类

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());
    }

1 个答案:

答案 0 :(得分:2)

我不知道你的index参数应该是什么(你用它做的东西对我来说没有任何意义),但它确实似乎是问题的根源。 / p>

首先,在shoot方法中,只有在非零时才增加它,所以如果它为零,它将永远为零。

然后在render中你只更新一个子弹而不是阵列中的所有子弹。

对我来说最清晰的解决方案(虽然我不知道你试图用index参数跟踪的内容)将完全删除index参数。然后用libgdx的Array类替换ArrayList,它允许在循环期间快速修改和删除,并像这样更改渲染方法。

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);
                }
            }
        }
    }
}