2017-05-06 6 views
0

こんにちは私はlibgdxとjavaを初めて使っていて、screen上に複数のオブジェクトを作成する際に問題があります。スペースをクリックすると、Pociskクラスの画面矩形上に新しいオブジェクトを作成したいのですが、ただ下に行く。複数の四角形を作成するjava libgdx

ゲームクラス

public class Gra extends ApplicationAdapter { 
    SpriteBatch batch; 
    private Texture Statektekstura,Pocisktekstura; 
    private Statek statek; 
    private Pocisk pocisk; 

    @Override 
    public void create() { 
     zaladujdane(); 
     init(); 
    } 

    private void init() { 
     batch=new SpriteBatch(); 
     statek=new Statek(Statektekstura); 
     pocisk=new Pocisk(Pocisktekstura); 
    } 

    private void zaladujdane() { 
     //tekstura statku pomniejszana 
     Pixmap pixmap2 = new Pixmap(Gdx.files.internal("statek.jpg")); 
     Pixmap pixmap1 = new Pixmap(100, 100, pixmap2.getFormat()); 
     pixmap1.drawPixmap(pixmap2, 
       0, 0, pixmap2.getWidth(), pixmap2.getHeight(), 
       0, 0, pixmap1.getWidth(), pixmap1.getHeight() 
     ); 
     Statektekstura=new Texture(pixmap1); 

     //tekstura pocisk pomniejszona 
     Pixmap pixmap20 = new Pixmap(Gdx.files.internal("pocisk.jpg")); 
     Pixmap pixmap10 = new Pixmap(35, 35, pixmap20.getFormat()); 
     pixmap10.drawPixmap(pixmap20, 
       0, 0, pixmap20.getWidth(), pixmap20.getHeight(), 
       0, 0, pixmap10.getWidth(), pixmap10.getHeight() 
     ); 

     Pocisktekstura=new Texture(pixmap10); 
    } 

    @Override 
    public void render() { 
     udpdate(); 
     Gdx.gl.glClearColor(1, 1, 1, 1); 
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
     batch.begin(); 
     statek.draw(batch); 
     pocisk.draw(batch); 

     batch.end(); 
    } 

    private void udpdate() { 
     przesuwanie(); 
     pocisk.y=pocisk.y+pocisk.pociskpredkosc*Gdx.graphics.getDeltaTime();   
    } 

    private void przesuwanie() { 
     if(Gdx.input.isKeyPressed(Keys.A)) 
     { 
      statek.x=statek.x-250*Gdx.graphics.getDeltaTime(); 
     } 
     if(Gdx.input.isKeyPressed(Keys.D)) 
     { 
      statek.x=statek.x+250*Gdx.graphics.getDeltaTime(); 
     } 
     if(Gdx.input.isKeyPressed(Keys.SPACE)) 
     { 

      pocisk=new Pocisk(Pocisktekstura); 
      pocisk.strzal();  
     }  
    } 

    @Override 
    public void dispose() { 
     //batch.dispose(); 
    } 
} 

クラスPociskコード:

public class Pocisk extends Rectangle { 

    private Texture texture; 
    public float pociskpredkosc=0; 

    Pocisk(Texture texture) 
    { 
     this.texture=texture; 
     this.height=texture.getHeight(); 
     this.width=texture.getWidth(); 
    } 

    public void draw(SpriteBatch batch) 
    { 
     batch.draw(texture, x, y); 
    } 

    public void strzal() 
    { 
     pociskpredkosc=pociskpredkosc+80; 
    } 
} 

私は私は私がスペースをクリックしたときに、常に新しいRectangleを作るために変更すべきかクラスGRAにないクラスPociskに失敗したと思いますか?

+0

複数の矩形を一度に1つずつ表示するか、一度に画面上に矩形の数を表示できますか? Rectangleの開始位置/初期位置とサイズはどこですか? – Aryan

+0

'strzal()'メソッドや 'pociskpredkosc'変数で何をしたいですか? – Aryan

+0

あなたが見ているエラーを投稿できますか? – John

答えて

1

新しいオブジェクトを作成し、変数pociskを参照するたびに、単一のpociskリファレンスで作業しています。 pociskが最初の位置から開始するたびに、その変数によって実行されるPociskの更新。複数のpociskの場合は、すべてのオブジェクト参照を保持し、その参照を更新する必要があります。したがって、すべての参照を格納するコンテナを使用してください。同じものにはArrayを使用できます。

public class MainGame extends ApplicationAdapter { 
    SpriteBatch batch; 
    private Texture Statektekstura,Pocisktekstura; 
    private Statek statek; 
    Array<Pocisk> pociskList; 
    boolean oneAtOnce; 

    @Override 
    public void create() { 
     zaladujdane(); 
     init(); 
    } 

    private void init() { 
     batch=new SpriteBatch(); 
     statek=new Statek(Statektekstura); 
     pociskList=new Array<Pocisk>(); 
    } 

    private void zaladujdane() { 
     //tekstura statku pomniejszana 
     Pixmap pixmap2 = new Pixmap(Gdx.files.internal("badlogic.jpg")); 
     Pixmap pixmap1 = new Pixmap(100, 100, pixmap2.getFormat()); 
     pixmap1.drawPixmap(pixmap2, 
       0, 0, pixmap2.getWidth(), pixmap2.getHeight(), 
       0, 0, pixmap1.getWidth(), pixmap1.getHeight() 
     ); 
     Statektekstura=new Texture(pixmap1); 

     //tekstura pocisk pomniejszona 
     Pixmap pixmap20 = new Pixmap(Gdx.files.internal("badlogic.jpg")); 
     Pixmap pixmap10 = new Pixmap(35, 35, pixmap20.getFormat()); 
     pixmap10.drawPixmap(pixmap20, 
       0, 0, pixmap20.getWidth(), pixmap20.getHeight(), 
       0, 0, pixmap10.getWidth(), pixmap10.getHeight() 
     ); 

     Pocisktekstura=new Texture(pixmap10); 
    } 

    @Override 
    public void render() { 
     udpdate(); 
     Gdx.gl.glClearColor(1, 1, 1, 1); 
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
     batch.begin(); 
     statek.draw(batch); 
     for(Pocisk pocisk:pociskList) 
      pocisk.draw(batch); 

     batch.end(); 
    } 

    private void udpdate() { 
     przesuwanie(); 
     for (Pocisk pocisk:pociskList) 
     pocisk.y=pocisk.y+pocisk.pociskpredkosc*Gdx.graphics.getDeltaTime(); 
    } 

    private void przesuwanie() { 
     if(Gdx.input.isKeyPressed(Input.Keys.A)) 
     { 
      statek.x=statek.x-250*Gdx.graphics.getDeltaTime(); 
     } 
     if(Gdx.input.isKeyPressed(Keys.D)) 
     { 
      statek.x=statek.x+250*Gdx.graphics.getDeltaTime(); 
     } 
     if(Gdx.input.isKeyPressed(Input.Keys.SPACE)) 
     { 
      Pocisk pocisk=new Pocisk(Pocisktekstura); //Called in game render method so create number of Object 
      pocisk.strzal(); 
      pociskList.add(pocisk); 

     } 
    } 

    @Override 
    public void dispose() { 
     //batch.dispose(); 
    } 
} 

私はそれはあなたが作成したオブジェクトのKeys.SPACEので、番号を押す複数回実行して、あなたがゲームrender方法でPociskオブジェクトを作成していることを思い出させます。 InputProcessorインタフェースのkeyDownメソッドにオブジェクトを作成する方が良いです。

+0

スレッド「LWJGL Application」の例外java.lang.IllegalStateException:開始前にSpriteBatch.endを呼び出す必要があります。 com.badlogic.gdxで com.badlogic.gdx.graphics.g2d.SpriteBatch.beginで\t(SpriteBatch.java:167) com.mygdx.game.Gra.renderで\t(Gra.java:61) \t .backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:225) \t com.badlogic.gdx.backends.lwjgl.LwjglApplication $ 1.run(LwjglApplication.java:126)あなたが示したように変更したとき、私はこのエラーが発生しました。 –

+1

私はあなたのコピーし、私はこのコードを分析する必要があります、ありがとう! –

+0

この矩形が配列のときに、どのようにオーバーラップさせたり、衝突を起こしたりできるか知っていますか? Pociskクラスのこの矩形が配列である他の矩形をヒットするたびに衝突を起こしたい。 –

関連する問題