Reputation: 39
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
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