当前位置: 首页 > 知识库问答 >
问题:

在libgdx中绘制多个sprite

程俊力
2023-03-14

我使用的是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个答案

徐绪
2023-03-14

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

这就是问题所在,您必须为每个敌人对象创建一个新的Sprite()。但是,当你改变一个敌人的精灵位置时,所有敌人的位置都改变了。

如您所见,执行敌人[0].getsprite()敌人[1].getsprite()时,您将到达相同的sprite。您可以通过引用相等性Engream[0].getsprite()==Engreem[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)方法,以确保sprite的位置得到正确更新。

public void update(float delta){
    time += delta;
    if(time >= 3.0f)
        gameOver = true;
    sprite.setPosition(x, y);
}
 类似资料:
  • 问题内容: 好的,我有这个代码 并且它将淡蓝色的背景绘制到屏幕上。我正在尝试创建一个渐变,该渐变从顶部的深蓝色到底部的浅蓝色。有没有简单的方法可以做到这一点?我是Libgdx和OpenGL的新手,所以我正尝试从书中学习,但我似乎找不到答案。我听说过要绘制一个大正方形并为顶点设置不同的颜色,但是我不确定该怎么做。 问题答案: 在libGDX中,ShapeRenderer对象包含一个方法,该方法为其位

  • 问题内容: 我非常敢打赌,我做了一些愚蠢的事情,只是似乎没注意到。 该项目是使用提供 gdx-setup-ui.jar 的模板工具生成的。 正如您在代码中所看到的,我没有费心去掉默认代码(只是一些简单的绘制代码来渲染LibGDX徽标)。 因此,对于干净生成的项目,我在这里遵循了本指南 http://code.google.com/p/libgdx- users/wiki/addingText2D

  • 问题内容: 我似乎无法弄清楚如何正确旋转位图字体。我认为您修改了SpriteBatch的转换矩阵。但是,尝试旋转会使文本绕某个点旋转,而且我不知道如何相对于文本本身旋转文本。 问题答案: 您可以尝试以下代码:

  • parameter.size=30; parameter.characters=“abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789.'()>?:”; font=generator.generateFont(参数); gdx.gl20.glclear(GL20.gl_color_buffer_bit); Begin(); f

  • 我的迭代器 我的绘图方法

  • 我在MyGdxGame中的render方法看起来是这样的,调用舞台绘制自己(连同它的演员),然后我尝试绘制一组纹理以供调试之用。 舞台和它的一个演员一起绘制,但其他的纹理没有被绘制。 我试过的:在舞台相机上设置批处理投影矩阵(在调用之后),确保纹理坐标应该是可见的。