Filip Koper
Filip Koper

Reputation: 39

Creating multiple Rectangles java libgdx

Hello i am new to libgdx and java and i have a problem with creating multiple Objects on screen.When i click SPACE i want to have a new object on screen rectangle from class Pocisk but when i click it just go down.

Game class

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

class Pocisk code:

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

I think i failed in class gra not in class Pocisk what should i change to make a new Rectangle always when i click space?

Upvotes: 0

Views: 265

Answers (1)

AAryan
AAryan

Reputation: 20140

You are working on single pocisk reference, each time you're creating new object and referencing to pocisk variable. Update on Pocisk performed by that variable so each time pocisk start from initial position. For multiple pocisk you need to keep all object reference and perform update on that reference, So use any container to store all reference. You can use Array for the same.

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

I'll remind you that you're creating Pocisk object in game render method so it executes multiple times when you pressed Keys.SPACE so number of object created. It's better to create object in keyDown method of InputProcessor interface.

Upvotes: 1

Related Questions