0

私は現在、スペースインベーダー スタイルのゲームに取り組んでいますが、弾丸の複数のインスタンスで少し問題が発生しました。現時点では、1つしか発射できません。私はそれを配列リストで動作させようとしていますが、動作させることができないようです。私がそれを機能させるのに最も近かったのは、複数の弾丸を発射しましたが、弾丸が船の位置に関連して出現しなかったため、それらはすべて同じ場所から出現しました。オブジェクトが境界を超えた後にオブジェクトを削除すると、ゲームもクラッシュしました。誰が私が間違っているのかを知るのを手伝ってくれますか? ここに私がこれまでに持っているいくつかのコードがありますコメントアウトされた部分は、配列リストを機能させるための私の試みです

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

}
4

1 に答える 1

5

まず、Bullet bulletインスタンス変数を忘れてください。必要ありません。リストで十分です。

別のことは、ランダムアクセスが必要なく、アイテムを頻繁に追加および削除する必要がLinkedListあるため、代わりにa を使用できることです。弾丸を反復して衝突をチェックするときは、 a を使用してその場で削除します。ArrayListListIterator<T>

最後に、次のようになります。

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

これは、基本的な考え方を示すためのものです。

slick2d と、それがレンダリング スレッドとロジック スレッドをどのように管理するのかわかりません。それらが 2 つの異なるスレッドである場合は、同期化されたリストを使用する必要があります。

List<Bullet> bullets = Collections.synchronizedList(new ArrayList<Bullet>());
于 2013-01-08T02:00:15.913 に答える