我的角色拍摄有问题。当按下 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());
}
答案 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);
}
}
}
}
}