Resetting the viewport after creating/rendering a scene2d Stage(创建/渲染场景 2d 舞台后重置视口)
问题描述
在我的游戏中,我正在使用自定义世界坐标系绘制场景 2d Stage
.
In my game I am drawing a scene2d Stage
using a custom world coordinate system.
然后我想绘制一个带有一些文本的调试 UI,例如 FPS,但只是使用屏幕坐标,即文本位于屏幕右上角的位置.我的主要渲染方法如下所示:
I then want to draw a debug UI with some text like FPS on top of that, but simply using screen coordinates, i.e. where the text is positioned in the upper right corner of the screen. My main render method looks something like this:
@Override
public void render(float delta) {
Gdx.gl.glClearColor(1, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
gameStage.act(delta);
gameStage.draw();
debugInfo.render(delta);
}
Stage
设置自定义视口:
public GameStage(GameDimensions dimensions, OrthographicCamera camera) {
// mapWith will be smaller than screen width
super(new FitViewport(dimensions.mapWidth, dimensions.mapHeight, camera));
...
}
DebugInfo
渲染代码如下所示:
public DebugInfo() {
Matrix4 mat = new Matrix4();
mat.setToOrtho2D(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
batch.setProjectionMatrix(mat);
}
@Override
public void render(float delta) {
batch.begin();
font.setScale(2f);
drawText("FPS " + Gdx.graphics.getFramesPerSecond());
batch.end();
}
private void drawText(String text) {
final BitmapFont.TextBounds textBounds = font.getBounds(text);
textPos.x = Gdx.graphics.getWidth() - textBounds.width - MARGIN;
textPos.y = Gdx.graphics.getHeight() - MARGIN;
textPos.z = 0;
font.draw(batch, text, textPos.x, textPos.y);
}
问题是即使我没有参考舞台的世界系统或它的相机,而是严格使用像素值和相应的投影矩阵,文本出现在舞台视口的右上角,即 比屏幕小.我希望它看起来与屏幕角落的舞台分离.
The problem is that even though I make no reference whatsoever to the stage's world system or its camera, but strictly use pixel values and an according projection matrix, the text appears in the upper right corner of the stage's viewport, which is smaller than the screen. I want it to appear detached from the stage in the screen's corner instead.
我可以将问题归结为 Stage
实例本身的创建;停下来画它是不够的.我实际上必须删除对 super(new FitViewport(...))
的调用以防止这种情况发生.
I could pinpoint the problem down to the creation of the Stage
instance itself; stopping to draw it is not enough. I actually have to remove the call to super(new FitViewport(...))
to prevent this from happening.
这让我相信我需要在渲染 UI 叠加层之前以某种方式重置渲染管道的视口?我该怎么做?
This leads me to believe that I need to somehow reset the viewport of the rendering pipeline before I render the UI overlay? How would I do that?
推荐答案
我的第一个答案是错误的.现在,当我查看 Viewport
源代码时,我可以看到它使用了 OpenGL 的 glViewPort 实际上它会影响所有后续的绘图调用.所以你必须在渲染你的东西之前用适当的尺寸调用 glViewport
:
My first answer was wrong. Now, when I've looked into Viewport
source code I can see that it uses OpenGL's glViewPort and indeed it affects all subsequent draw calls. So you have to call glViewport
with appropriate dimensions before rendering your stuff:
@Override
public void render(float delta) {
Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
batch.begin();
font.setScale(2f);
drawText("FPS " + Gdx.graphics.getFramesPerSecond());
batch.end();
}
这篇关于创建/渲染场景 2d 舞台后重置视口的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:创建/渲染场景 2d 舞台后重置视口


- 如何检查发送到 Android 应用程序的 Firebase 消息的传递状态? 2022-01-01
- 在测试浓缩咖啡时,Android设备不会在屏幕上启动活动 2022-01-01
- 使用自定义动画时在 iOS9 上忽略 edgesForExtendedLayout 2022-01-01
- 想使用ViewPager,无法识别android.support.*? 2022-01-01
- 用 Swift 实现 UITextFieldDelegate 2022-01-01
- Android - 拆分 Drawable 2022-01-01
- MalformedJsonException:在第1行第1列路径中使用JsonReader.setLenient(True)接受格式错误的JSON 2022-01-01
- android 4中的android RadioButton问题 2022-01-01
- Android viewpager检测滑动超出范围 2022-01-01
- Android - 我如何找出用户有多少未读电子邮件? 2022-01-01