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);
}
我正在尝试绘制一个 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);
}