Рисование нескольких спрайтов в libgdx

#java #libgdx #sprite

#java #libgdx #спрайт

Вопрос:

Я использую libgdx 1.2.0 eclipse. Я хочу нарисовать несколько спрайтов из класса на моем игровом экране, но рисуется только один спрайт. Это мой метод рендеринга

 @Override
public void render(float delta) {
    Gdx.gl.glClearColor(100/255f, 0, 0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    if(Gdx.input.justTouched()){
        touchX = Gdx.input.getX();
        touchY = Gdx.input.getY();
        //for(int i=0; i < enemy.length; i  )
            //System.out.println(enemy[i].x   " "   enemy[i].y);
    }

    for(int i=0; i< enemy.length; i  ){
        enemy[i].update(delta);

        if(enemy[i].getSprite().getBoundingRectangle().contains(touchX/ppX, touchY/ppY))
            enemy[i].reset();

        if(enemy[i].gameOver){
            gameOver = true;
            //System.out.println("Over");
        }

    }

    game.batch.begin();

    //if(!gameOver){
        for(int i=0; i < enemy.length; i  )
            enemy[i].getSprite().draw(game.batch);
    //}

    game.batch.end();

}
 

То же самое происходит, если я вызываю

 enemy[0].getSprite().draw(game.batch);
enemy[1].getSprite().draw(game.batch);
 

Он всегда рисует что-то, если я вызываю только один из них.

Это вражеский класс. Я загружаю один и тот же спрайт из класса game screen в каждый экземпляр Enemy, но меняю его положение.

 public class Enemy {

private final float minX=1, minY=2;
private final float maxX=31, maxY=18;

private float x,y;
private float time;

private Sprite sprite;

boolean gameOver;

public Enemy(Sprite sprite){
    this.sprite = sprite;
    reset();
}

public Sprite getSprite(){
    return sprite;
}

public void reset(){
    x = minX   (int)(Math.random() * (maxX - minX   1));
    y = minY   (int)(Math.random() * (maxY - minY   1));
    time = 0.0f;
    gameOver = false;
    sprite.setPosition(x, y);
}

public void update(float delta){
    time  = delta;
    if(time >= 3.0f)
        gameOver = true;
}

}
 

Ответ №1:

Я загружаю один и тот же спрайт из класса game screen в каждый экземпляр Enemy, но меняю его положение.

Это проблема, вы должны создать new Sprite() для каждого Enemy объекта. Однако, когда вы меняете положение спрайта врага, положение всех врагов изменяется.

побочный эффект

Как вы можете видеть, вы получите тот же спрайт, выполнив enemy[0].getSprite() или enemy[1].getSprite() . Вы можете легко проверить это с помощью ссылочного равенства enemy[0].getSprite()==enemy[1].getSprite() .

Вы можете решить эту проблему с помощью чего-то вроде

 public Enemy(Sprite sprite){
    this.sprite = new Sprite(sprite);
    reset();
}
 

Еще одна странная вещь в вашем коде :

 public void reset(){
    x = minX   (int)(Math.random() * (maxX - minX   1));
    y = minY   (int)(Math.random() * (maxY - minY   1));
    time = 0.0f;
    gameOver = false;
    sprite.setPosition(x, y);
}
 

Если вы это сделаете sprite.setPosition(x, y) , то изменения x и y недостаточно для изменения положения спрайта. Вы должны улучшить свой update(float delta) метод таким образом, чтобы гарантировать, что позиция спрайта правильно обновляется.

 public void update(float delta){
    time  = delta;
    if(time >= 3.0f)
        gameOver = true;
    sprite.setPosition(x, y);
}
 

Комментарии:

1. Изменение в Enemy конструкторе класса решило мою проблему. Почему необходимо изменить положение моего спрайта в update(fload delta) методе? x и y изменяются только в reset() методе.

2. @96andrei На самом деле, необходимо изменить положение спрайта update(float delta) только в том случае, если ваши враги двигаются 🙂