LibGDX - setProjectionMatrix() "hiding" 一个精灵

LibGDX - setProjectionMatrix() "hiding" a Sprite

我正在尝试绘制一个 Sprite 但它只在我第一次 运行 我的程序时出现一帧,然后立即消失。我正在使用一张 Stage、一张平铺地图和两张 Batches,我希望这不是问题。

看起来这个精灵好像躲在别的东西后面,但我完全确定它后面没有画任何东西。因此,经过长时间的折腾,我发现删除 setProjectionMatrix() 方法“解决”了我的问题,因为精灵以某种方式完美显示。

我完全不明白发生这种情况的原因,我不想只删除方法并让精灵跟随相机,所以:

setProjectionMatrix() 方法为何或如何“隐藏”Sprite?它会改变我的精灵绘制的顺序吗?最重要的是,我该如何修复它?

这是我的 render 方法:

public void render(float delta) {
    Render.cleanScreen(); //Render is a class i made with useful static stuff, like the Batch i am using.
                          //This method is pretty much just a Gdx.gl.glClearColor() method.
    
    tmr.setView(camera); // tileMapRenderer
    tmr.render();
    b2dr.render(world, camera.combined); // Box2DDebugRenderer
    stage.act();
    stage.draw();
    
    Render.batch.begin(); 
    sprite2.draw(Render.batch); //The sprite i want to draw
    Render.batch.end();

    hudBatch.begin();
    sprite1.draw(hudBatch); //This works fine
    hudBatch.end();

    Render.batch.setProjectionMatrix(camera.combined);
    Gdx.input.setInputProcessor(stage);
}

编辑:有人要求提供额外信息,所以:

• This is what my game looks like with the setProjectionMatrix (after the first frame when the Sprite dissapears) and this 是我删除它时的样子。你可以清楚地看到红色方块(精灵)。

• 我目前正在使用 FitViewport。

Stage.draw() 在舞台的视口上调用 apply(),但从未将 OpenGL 视口恢复到之前的状态。我猜你的舞台使用 FitViewport,所以它正在裁剪屏幕的一部分。如果您希望在舞台外绘制的东西有不同的视口行为,您应该为此创建一个单独的视口,并在开始渲染其他东西之前调用 viewport.apply()

旁注:如果您延迟加载任何使用本机内存的东西(如 SpriteBatch 和 Texture,实现 Disposable 的东西)并将引用存储在静态变量(您的 Render class)中,请确保您处置所有这些并在游戏的 destroy() 方法中将其清零。否则,在 Android 你会泄露那些东西,当你重新打开你的游戏时它将无法工作。

另一个旁注:在我看来,不应该使用 Sprite class 除非你有数百个并且它们移动不多(在这种情况下它可能会有更好的性能)。 Sprite 是资产(TextureRegion)和游戏状态数据的奇怪组合。因此,它可能会产生您必须解决的设计问题,例如当您想要对其进行动画处理或翻转时。最好创建自己的 GameObject class,它引用一个 TextureRegion(它的单个实例可以被许多元素共享),并有自己的位置、颜色、旋转等变量。然后用使用这些属性的适当 SpriteBatch.draw 方法。在我的游戏中,我有一个围绕 TextureRegion 的包装器接口,它可以交替包装 Animation<TextureRegion> 因此我的游戏对象 class 可以使用其中任何一个并且可以轻松交换。这使得代码更改起来更加灵活。

所以...我刚刚意识到我的同事不小心删除了 viewport.update() 方法。

@Override
public void resize(int width, int height) {
    viewport.update(width, height);
}