我只为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);
}
}
答案 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);