在我目前正在开发的LibGDX游戏中,我遇到了一个关于视窗的问题。我正在尝试创建两个视区-一个容纳整个屏幕,包括控制,另一个容纳第一个中间的游戏视觉效果。This is what I mean.
然而,我在使用这些视窗时遇到了一些问题。首先,在FitViewport
的apply
内部渲染的平铺Map和播放器是看不到的(要么没有渲染,要么在可见的屏幕空间之外),但我的光线处理器的光是可以看到的(并且传播的比它分配的1:1更多)。Proof。
private OrthographicCamera camera;
Viewport v1;
Viewport v2;
//...
RayHandler devRay;
//...
TiledMap map;
OrthogonalTiledMapRenderer tmr;
Player player;
@Override
public void show() {
camera = new OrthographicCamera(VIRTUAL_WIDTH, VIRTUAL_HEIGHT);
camera.setToOrtho(false,Gdx.graphics.getWidth(),Gdx.graphics.getHeight());
//...
v1 = new ScreenViewport();
v2 = new FitViewport(160, 160, camera);
//...
tmr = new OrthogonalTiledMapRenderer(map);
tmr.setView(camera);
RayHandler.useDiffuseLight(true);
devRay = new RayHandler(world);
}
public void render(float delta) {
Gdx.gl.glClearColor(1,1,1,1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
v1.apply();
//Draw Controls
v2.apply();
//Draw Visuals
tmr.render(); //Tiled Map Renderer
player.render();
devRay.updateAndRender();
//...
}
我猜我完全忽略了视窗的要点。我想知道在我的项目中是否有办法将可玩区域和控制区域分开,这样,例如,我可以移动FitViewport
的摄像头,而游戏画面不会占据超过1:1的比例。谢谢你的帮助!
2条答案
按热度按时间9nvpjoqh1#
我通常做的是用一台相机来渲染世界,然后通过绘制最后一个
stage.draw()
的舞台来覆盖HUD。舞台就是最好的舞台。显然,这模糊了一些通常在没有HUD的情况下可以看到的游戏世界,所以如果你真的想要多个“视窗”,那么你必须使用Viewports
。视区易于实现,并且可以为您处理所有内容if you pick the correct one。设置摄影机后,您可以创建如下所示的视区:
这将使用
setScreenBounds(...)
在屏幕的左半部创建一个视区。因为我们在相机上绘制的东西只有一半的屏幕,所以我们必须匹配宽高比,否则它会看起来被拉伸。要求澄清,因为这有时会有点令人困惑:
你实际上不需要指定相机的宽度和高度,因为一旦你用连接到副总裁的相机点击
vp.apply()
,它就会被覆盖。在
update()
方法中,在该特定视区上绘制任何内容之前,必须先应用视区viewport.apply()
。7uzetpgm2#
我也面临着同样的问题。Official Documentation中有答案。
多个视区使用具有不同屏幕大小的多个视区(或使用设置glViewport的其他代码)时,需要在绘制之前应用视区,以便为该视区设置glViewport。
当使用多个阶段时: