【问题标题】:libGdx: Sprite is not drawn when there is a stagelibGdx:有舞台时不绘制精灵
【发布时间】:2014-01-30 12:42:52
【问题描述】:

我确定我在这里遗漏了一些非常明显的东西,但我是初学者,所以请不要压垮我。我的问题是我有一个视口小于屏幕的舞台。现在我还想直接使用 Sprite.draw(SpriteBatch) 在屏幕上绘制一个 Sprite。 Sprite 的位置和舞台不重叠。舞台绘制得很好,但 Sprite 不可见。当我在渲染方法中注释掉 stage.draw() 部分时,Sprite 是可见的。

代码: 这是我的渲染方法:

@Override
public void render(float delta) {
    Gdx.gl.glClearColor(0.851f, 0.894f, 0.992f, 1f);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    camera.update();

    stage.act(delta);

    batch.setProjectionMatrix(camera.combined);
    batch.begin();
    stage.draw();
    logoSprite.draw(batch);
    batch.end();
}

在这里,我初始化了相机和舞台(stageHeight 是一个只有屏幕高度的 3/5* 的 int):

camera = new OrthographicCamera();
    camera.setToOrtho(false, SwapItGame.WIDTH, SwapItGame.HEIGHT);
    stage = new Stage();
    stage.setViewport(1080, stageHeight, true, 0, 0, 1080, stageHeight); //The button part of the menu takes up 3 fifth of the Height of hte screen
    stage.setCamera(camera);

这里我初始化了我的Sprite(sprite的位置值比较复杂,忽略它,肯定在舞台上方):

        logoSprite = skin.getSprite("logo");
        logoSprite.setPosition((SwapItGame.WIDTH-logoSprite.getWidth())/2, (SwapItGame.HEIGHT-stageHeight-logoSprite.getHeight())/2 + stageHeight);

精灵和舞台不可能在同一个屏幕上吗?还是我做错了什么?

【问题讨论】:

  • 发布代码...否则我们需要查看玻璃球,看看我们能猜到什么
  • 比较长,如果对你有帮助我当然会做。
  • 然后向我们展示渲染的部分和添加精灵的部分。没有代码,我们无法帮助您,因为我们看不到您做错了什么。
  • @MGDroid 我这样做了,但没有帮助

标签: java android libgdx


【解决方案1】:

尝试移动

stage.draw();

批量操作

stage.draw();
batch.setProjectionMatrix(camera.combined);
batch.begin();
logoSprite.draw(batch);
batch.end();

【讨论】:

  • 那行得通。谢谢。你能解释一下它为什么起作用吗?
  • 是的,因为舞台有自己的批次!所以您需要在使用stage.draw() 之前结束您的批次。否则你有批次的并发性。
  • 我不确定 :) batch.begin() batch.end() 是一个在屏幕上绘制东西的代码块,我只是想 stage.draw() 可能会影响这个过程
  • 但是当我这样做时,触摸事件的位置不正确:(
  • 试着把它放在你设置相机的地方,但在你设置之前batch.begin
【解决方案2】:

我知道这是旧的,但如果你不能或不想移动你的 stage.draw() 方法,只需在你的 stage.draw() 之前调用 batch.end(),然后立即重新启动你的批次......我在我的游戏中为不同的东西使用单独的游戏屏幕状态并试图移动我的 stage.draw() 并且它只破坏了我班级中的其他东西所以我最终只是尝试了这个,它就像一个魅力,如果上述解决方案不能轻松工作,可能会对某人有所帮助。

batch.end();
stage.draw();
batch.begin();

【讨论】: