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());
这里是询问screenWidth
和screenHeight
哪个代表屏幕坐标。由于每个人都使用不同的屏幕,我们从图形本身获得它。您可以猜测它在何处绘制视口 ;)。
无论如何,此视口 new FitViewport(1920 / 2, 1080)
将始终在屏幕的右半部分呈现 960 X 1080
我的世界。
如果我的世界 .9f x 1.6f
很大,那么我可以像这样初始化 vp new FitViewport(.9f, 1.6f, camera)
。
PS:
在开始绘图之前,不要忘记在 render()
中应用 VP。
我已经尝试解决这个问题 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());
这里是询问screenWidth
和screenHeight
哪个代表屏幕坐标。由于每个人都使用不同的屏幕,我们从图形本身获得它。您可以猜测它在何处绘制视口 ;)。
无论如何,此视口 new FitViewport(1920 / 2, 1080)
将始终在屏幕的右半部分呈现 960 X 1080
我的世界。
如果我的世界 .9f x 1.6f
很大,那么我可以像这样初始化 vp new FitViewport(.9f, 1.6f, camera)
。
PS:
在开始绘图之前,不要忘记在 render()
中应用 VP。