libgdx 在 FitViewport 之外批量绘制

libgdx batch draws outside of FitViewport

我已经尝试解决这个问题 3 周了。我通过 libgdx wiki 开始使用视口,并浏览了本论坛中有关视口、虚拟视口等的许多问题,发现我的游戏的最佳解决方案是拥有 2 个视口:1 个 Fitviewport 用于我的游戏渲染(不使用舞台),以及我的 UI 的另一个 Screenviewport(使用舞台)。 UI 绘制完美,尽管我有一个具体问题,我认为涉及 DPI 导致控件在三星 S4 上变得非常小并且它们几乎无法使用,但我将对此提出一个单独的问题。 我的问题是 libgdx 上的游戏渲染和 FitViewport。 我在实现 Screen 的 PlayScreen 构造函数上以这种方式设置游戏相机及其视口:

gameCamera = new OrthographicCamera();
gameCamera.setToOrtho(false);
gameViewport = new FitViewport(800, 480,gameCamera);

然后在渲染方法上我这样应用它:

input(Gdx.graphics.getDeltaTime());

update(Gdx.graphics.getDeltaTime());

Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

gameCamera.update();
uiCamera.update();
MyGame.batch.setProjectionMatrix(gameCamera.combined);
gameViewport.apply();
MyGame.batch.begin();   
//DRAW CODE AFTER THIS
MyGame.batch.end();

//apply stage ScreenViewport and draw:
game.stage.getViewport().apply();
game.stage.draw();

然后在调整大小的方法中我只有这两行:

game.stage.getViewport().update(width,height,true);
gameViewport.update(width,height);
gameCamera.position.set(Gdx.graphics.getWidth()/2,Gdx.graphics.getHeight()/2,0);

绘图方法基于Gdx.graphics.getHeight() 和Gdx.graphics.getWidth() 坐标。 我的游戏世界是一个自上而下的射击游戏,它使用 Gdx.graphics.getWidth() 和 getHeight() 来生成生物并限制玩家的移动。

同样,我遇到的问题如下: -FitViewport 似乎无法正常工作。当我在我的设备上尝试时,视口适合,创建了装订线,但我看不到相对于 Gdx.graphics 坐标绘制的玩家。 - 当我在桌面上以奇怪的分辨率进行试驾时,我可以看到子弹被拉到视口外进入排水沟线。我不知道为什么会这样。

我认为我的问题可能是我应该根据其他非 Gdx.graphics 维度的坐标来创建我的世界,但我似乎无法找到可能的解决方案。 但是我真的不明白为什么我能在排水沟里看到子弹。

我看到很多人都在为此苦苦挣扎,我必须承认我为时过早。但是一旦你了解了基础知识,它就很容易实现。

让我们以 FitViewport 为例,当您初始化此 new FitViewport(float worldWidth, float worldHeight, camera) 时,您正在指定世界坐标。这意味着视口将无论如何绘制世界的给定部分。

  • 如果你的世界再大一点也不会全部画出来
  • 如果您的视口在屏幕边界之外,您将看不到全部
  • 如果您的视口纵横比不等于正在绘制的这些世界纵横比,则会拉伸。

我们还没有设置屏幕边界,所以让我们开始吧:

vp.setScreenBounds(Gdx.graphics.getWidth() / 2, 0, Gdx.graphics.getWidth() / 2, Gdx.graphics.getHeight());

这里是询问screenWidthscreenHeight哪个代表屏幕坐标。由于每个人都使用不同的屏幕,我们从图形本身获得它。您可以猜测它在何处绘制视口 ;)。

无论如何,此视口 new FitViewport(1920 / 2, 1080) 将始终在屏幕的右半部分呈现 960 X 1080 我的世界。

如果我的世界 .9f x 1.6f 很大,那么我可以像这样初始化 vp new FitViewport(.9f, 1.6f, camera)

PS: 在开始绘图之前,不要忘记在 render() 中应用 VP。