Libgdx Sprite.draw()不会画任何东西

时间:2015-02-07 17:59:24

标签: android libgdx sprite draw

我只为Android制作游戏。 我正在使用Libgdx作为我正在进行的游戏的框架,我在绘制精灵方面遇到了麻烦。常规的SpriteBatch.draw()工作正常,但Sprite.draw()不起作用。 这是我主要课程的代码:

 private OrthographicCamera camera;
    private Texture currentBackground;
    private SpriteBatch batch;
    private Bunker bunker;
    private AssetManagerWrapper assetsManager = new AssetManagerWrapper();
    private Turret turret;

    @Override
    public void create() {
        camera = new OrthographicCamera();
        camera.setToOrtho(false, C.WIDTH_TARGET_RESOLUTION, C.HEIGHT_TARGET_RESOLUTION);
        batch = new SpriteBatch();
        assetsManager.loadGFX();
        assetsManager.finishLoading();
        createBunker();
        currentBackground = assetsManager.get(AssetsPaths.Gfx.Background.CITY_DAY);
    }

    private void createBunker() {
        bunker = new Bunker(assetsManager.get(AssetsPaths.Gfx.Bunker.BUNKER, Texture.class));
        turret = new Turret(assetsManager.get(AssetsPaths.Gfx.Bunker.TURRET, Texture.class), bunker.getCenterX(), (int) (bunker.getY() + bunker.getHeight() - 10));
    }

    @Override
    public void render() {
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        camera.update();
        batch.setProjectionMatrix(camera.combined);
        drawGFX();
    }

    private void drawGFX() {
        batch.begin();
        batch.draw(currentBackground, 0, 0);
        bunker.draw(batch);
        batch.end();
    }


    @Override
    public void dispose() {
        assetsManager.dispose();
    }

Bunker类扩展了名为GameObject的类,它扩展了Sprite。 由于某种原因,这一行:

bunker.draw(batch);

不会绘制精灵。但如果我把它改为:

batch.draw(bunker.getTexture(), bunker.getX(), bunker.getY());

它完美无缺。我知道我可以继续使用这种方式,但我担心由于我不知道的原因,效率可能会降低。

该行:

batch.draw(currentBackground, 0, 0);

也很完美。

我错过了什么吗?

提前致谢

编辑: 我将掩体对象位置更改为x = 0和y = 0。 这是getVertices()的打印: 0.0, 0.0, -1.7014117E38, 0.0, 0.0, 0.0, 5.9, -1.7014117E38, 0.0, 0.0, 100.0, 59.0, -1.7014117E38, 0.0, 0.0, 100.0, 0.0, -1.7014117E38, 0.0, 0.0,

我并不真正理解这些值,但似乎没有将精灵画在外面。

Bunker类只是扩展了GameObject类:

public class GameObject extends Sprite {

    public GameObject(Texture image, int x, int y) {
        setTexture(image);
        setBounds(x, y, image.getWidth(), image.getHeight());
        setPosition(x, y);
        setOrigin(x, y);
    }
}

2 个答案:

答案 0 :(得分:0)

可以从libgdx源中看到sprite.draw方法,以执行以下操作:

batch.draw(texture, getVertices(), 0, SPRITE_SIZE);

在所有现实中,使用batch.draw(bunker, ...运行它会更有效率,因为您不会调用getVertices()方法。

编辑:

我可能已经说得太高效了,当你调用batch.draw()时,SpriteBatch最终会为你导出顶点。 sprite.draw()应该更好,因为顶点已经计算过,只有在精灵变脏时才会重新计算。

如果您通过调用bunker.getVertices()并输出到日志来查找精灵的绘制位置,您可以看到它是否只是在视口之外绘制。

答案 1 :(得分:0)

将此添加到GameObject的构造函数中 super(image); 代替 setTexture(image);