2017-05-06 102 views
0

你好,我是新來的libgdx和java,我有一個屏幕上創建多個對象的問題。當我點擊空間,我想從類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; 
    } 
} 

我覺得我沒有在課堂上GRA不上課Pocisk我應該怎麼改變,使一個新的Rectangle總是當我點擊空間?

+0

多個矩形,一次一個或一次可能是屏幕上矩形的數量?矩形的起始/初始位置和大小在哪裏? – 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(); 
    } 
} 

我會提醒你,你正在創建遊戲render方法Pocisk對象,所以當你按下Keys.SPACE所以數來創建對象的它多次執行。在InputProcessor接口的keyDown方法中創建對象更好。

+0

線程「LWJGL應用程序」中的異常java.lang.IllegalStateException:必須在開始之前調用SpriteBatch.end。 \t在com.badlogic.gdx.graphics.g2d.SpriteBatch.begin(SpriteBatch.java:167) \t在com.mygdx.game.Gra.render(Gra.java:61) \t在com.badlogic.gdx .backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:225) \t at com.badlogic.gdx.backends.lwjgl.LwjglApplication $ 1.run(LwjglApplication.java:126)當我像你顯示的那樣改變時,我有這個錯誤。 –

+1

我複製你的,它的作品,我必須分析這段代碼,非常感謝你! –

+0

你知道當矩形是數組時,我可以重疊或者發生碰撞嗎?每當這個Pocisk類的矩形碰到另外一個矩形時,我也想做出碰撞。 –