在libgdx中绘制多个精灵

时间:2014-06-26 08:16:39

标签: java libgdx sprite

我正在使用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);

如果我只打电话给其中一个,它总会吸引一些东西。

这是敌人类。我在每个敌人的实例中从游戏画面类中加载相同的精灵,但是我改变了它的位置。

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 个答案:

答案 0 :(得分:3)

  

我在每个实例中从游戏屏幕类加载相同的精灵   敌人,但我改变了它的位置。

问题是,您必须为每个new Sprite()对象创建Enemy。但是,当你改变敌人的精灵位置时,所有敌人的位置都会改变。

side effect

如您所见,您将与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),则修改xy不足以更改精灵的位置。您应该以这种方式改进update(float delta)方法,以确保精灵的位置得到正确更新。

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