繁体   English   中英

在libgdx中绘制多个精灵

[英]Drawing multiple sprites in 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);

如果我只呼叫其中之一,它总是会吸引人。

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

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

}

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

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

副作用

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM