2017-05-06 47 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类的矩形碰到另外一个矩形时,我也想做出碰撞。 –