【问题标题】:Drawing multiple sprites in libgdx在 libgdx 中绘制多个精灵
【发布时间】:2014-06-26 08:16:39
【问题描述】:

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

如果我只调用其中一个,它总是会画出一些东西。

这是 Enemy 类。我在 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;
}

}

【问题讨论】:

    标签: java libgdx sprite


    【解决方案1】:

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

    这是问题所在,您必须为每个 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 不足以改变精灵的位置。您应该以这种方式改进您的update(float delta) 方法,以确保正确更新精灵的位置。

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

    【讨论】:

    • Enemy 类构造函数的变化解决了我的问题。为什么必须在update(fload delta) 方法中更改我的精灵位置? xy 仅在 reset() 方法中修改。
    • @96andrei 实际上,只有当你的敌人移动时,才有必要在update(float delta) 期间改变精灵的位置:)
    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2016-03-13
    • 2015-06-21
    • 2013-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多