Java 在太空入侵者风格的游戏中使用ArrayLIst创建子弹对象

Java 在太空入侵者风格的游戏中使用ArrayLIst创建子弹对象,java,arraylist,slick2d,Java,Arraylist,Slick2d,我目前正在开发一款太空入侵者风格的游戏,但我遇到了一点麻烦,因为有多个子弹的例子。目前我只能开一辆。我一直在尝试让它与数组列表一起工作,但我似乎无法让它工作。我发现它最接近工作状态的地方是,它发射了多发子弹,但它们都是从同一个位置产生的,因为子弹并没有从船的位置产生。当我移除一个超过边界的物体时,游戏也崩溃了。谁能帮我看看哪里出了问题。这是我到目前为止已经完成的一些代码,注释掉的部分是我试图让数组列表工作的部分 import java.util.ArrayList; import

我目前正在开发一款太空入侵者风格的游戏,但我遇到了一点麻烦,因为有多个子弹的例子。目前我只能开一辆。我一直在尝试让它与数组列表一起工作,但我似乎无法让它工作。我发现它最接近工作状态的地方是,它发射了多发子弹,但它们都是从同一个位置产生的,因为子弹并没有从船的位置产生。当我移除一个超过边界的物体时,游戏也崩溃了。谁能帮我看看哪里出了问题。这是我到目前为止已经完成的一些代码,注释掉的部分是我试图让数组列表工作的部分

    import java.util.ArrayList;
    import org.newdawn.slick.Input;
    import org.newdawn.slick.Graphics;
    import org.newdawn.slick.GameContainer;

    public class Player extends Entity 
    {
 private int speed = 5;
 private ArrayList<Bullet> bulletList;
 private boolean firing;
 private Bullet bullet;

public Player()
{   
    bullet = new Bullet();
    //bulletList = new ArrayList<Bullet>();
    this.setImage("ship");
    this.setPosition(350,450);
    this.setDimenseions(100, 100);
    this.createRectangle();
}

@Override
public void entityLogic(GameContainer gc, int deltaTime) 
{
    Input input = gc.getInput();

    if(input.isKeyDown(Input.KEY_A))
    {
        this.x -= speed;
    }

    if(input.isKeyDown(Input.KEY_D))
    {
        this.x += speed; 
    }

    if(input.isKeyDown(Input.KEY_W))
    {
        this.y -= speed;
    }

    if(input.isKeyDown(Input.KEY_S))
    {
        this.y += speed;
    }

    if(input.isKeyPressed(Input.KEY_SPACE))
    {
        firing = true;
        bullet.x = this.getX()+40;

        //BulletList.add(new Bullet());
    }

    if(firing)
    {
        /*Carries out the logic for the bullet*/

        //for(Bullet b : bulletList)
        //{
            //b.entityLogic(gc, deltaTime);
        //}

        //Moves the bullet negativly along the y axis
        bullet.entityLogic(gc, deltaTime);
    }
}

@Override
public void entityRendering(Graphics g) 
{
    g.drawImage(this.getImage(), this.getX(), this.getY());

    if(firing)
    {
        /*Draws each bullet object in the list*/

        //for(Bullet b : bulletList)
        //{
            //b.entityRendering(g);
        //}

        bullet.entityRendering(g);
    }
}

}
import java.util.ArrayList;
导入org.newdawn.slick.Input;
导入org.newdawn.slick.Graphics;
导入org.newdawn.slick.GameContainer;
公共类播放器扩展实体
{
私人内部速度=5;
私人ArrayList公告列表;
私有布尔触发;
私人子弹;
公共玩家()
{   
bullet=新bullet();
//bulletList=新的ArrayList();
本文件为setImage(“船舶”);
此设置位置(350450);
这个。设置尺寸(100100);
这是createRectangle();
}
@凌驾
public void entityLogic(GameContainer gc,int deltaTime)
{
Input=gc.getInput();
if(input.isKeyDown(input.KEY_A))
{
这个.x-=速度;
}
if(input.isKeyDown(input.KEY\u D))
{
这个.x+=速度;
}
if(input.isKeyDown(input.KEY_W))
{
这个.y-=速度;
}
if(input.isKeyDown(input.KEY_))
{
这个.y+=速度;
}
如果(按输入键isKeyPressed(输入键_空格))
{
发射=真;
bullet.x=this.getX()+40;
//BulletList.add(新的Bullet());
}
如果(发射)
{
/*执行项目符号的逻辑*/
//对于(项目符号b:项目符号列表)
//{
//b、 实体逻辑(gc、deltaTime);
//}
//沿y轴负向移动项目符号
bullet.entityLogic(gc、deltaTime);
}
}
@凌驾
公共空间实体招标(图g)
{
g、 drawImage(this.getImage()、this.getX()、this.getY());
如果(发射)
{
/*绘制列表中的每个项目符号对象*/
//对于(项目符号b:项目符号列表)
//{
//b、 整体招标(g);
//}
项目符号。整个招标(g);
}
}
}

首先,忘记您的
Bullet
实例变量。你不需要它,清单就足够了

另一件事是,您可以使用
LinkedList
而不是
ArrayList
,因为您不需要随机访问,并且必须频繁添加和删除项目,当您迭代项目符号以检查冲突时,请使用
ListIterator
并动态删除它们

最后,它应该是这样的:

List<Bullet> bullets = new ArrayList<Bullet>();

public void entityLogic(GameContainer gc, int deltaTime) {
  // since this method is called many times you should shoot a bullet just every X msec
  if (spacebar pressed) {
    // you spawn a new bullet according to player position
    Bullet bullet = new Bullet(player.x,player.y);
    // you add it to the list
    bullets.add(bullet);
  }

  // destroy bullets which are outside the viewport
  for (int i = 0; i < bullets.size(); ++i) {
    Bullet bullet = bullets.get(i);
    if (bullet.isOutsideBounds()) {
      bullets.remove(i);
      i--;      
    }
}

public void entityRendering(Graphics g) {
  for (Bullet bullet : bullets)
    bullets.entityRenering(g);
}
  }
列表项目符号=新建ArrayList();
public void entityLogic(GameContainer gc,int deltaTime){
//因为这个方法被调用了很多次,所以你应该每X毫秒发射一颗子弹
如果(按空格键){
//你根据玩家的位置产生一个新的子弹
子弹=新子弹(player.x,player.y);
//您可以将其添加到列表中
项目符号。添加(项目符号);
}
//销毁视口外的子弹
对于(int i=0;i
这只是给你一个基本的想法

我不知道slick2d以及它如何管理渲染线程和逻辑线程,如果它们是两个不同的线程,那么您应该使用一个同步列表,例如:

List<Bullet> bullets = Collections.synchronizedList(new ArrayList<Bullet>());
List项目符号=Collections.synchronizedList(新的ArrayList());

首先,忘记您的
Bullet
实例变量。你不需要它,清单就足够了

另一件事是,您可以使用
LinkedList
而不是
ArrayList
,因为您不需要随机访问,并且必须频繁添加和删除项目,当您迭代项目符号以检查冲突时,请使用
ListIterator
并动态删除它们

最后,它应该是这样的:

List<Bullet> bullets = new ArrayList<Bullet>();

public void entityLogic(GameContainer gc, int deltaTime) {
  // since this method is called many times you should shoot a bullet just every X msec
  if (spacebar pressed) {
    // you spawn a new bullet according to player position
    Bullet bullet = new Bullet(player.x,player.y);
    // you add it to the list
    bullets.add(bullet);
  }

  // destroy bullets which are outside the viewport
  for (int i = 0; i < bullets.size(); ++i) {
    Bullet bullet = bullets.get(i);
    if (bullet.isOutsideBounds()) {
      bullets.remove(i);
      i--;      
    }
}

public void entityRendering(Graphics g) {
  for (Bullet bullet : bullets)
    bullets.entityRenering(g);
}
  }
列表项目符号=新建ArrayList();
public void entityLogic(GameContainer gc,int deltaTime){
//因为这个方法被调用了很多次,所以你应该每X毫秒发射一颗子弹
如果(按空格键){
//你根据玩家的位置产生一个新的子弹
子弹=新子弹(player.x,player.y);
//您可以将其添加到列表中
项目符号。添加(项目符号);
}
//销毁视口外的子弹
对于(int i=0;i
这只是给你一个基本的想法

我不知道slick2d以及它如何管理渲染线程和逻辑线程,如果它们是两个不同的线程,那么您应该使用一个同步列表,例如:

List<Bullet> bullets = Collections.synchronizedList(new ArrayList<Bullet>());
List项目符号=Collections.synchronizedList(新的ArrayList());

谢谢。这就解决了问题。我不知道我怎么没看到。我想假期过后我开始生锈了。谢谢。这就解决了问题。我不知道我怎么没看到。我想假期过后我开始生锈了。