我已经尝试到处寻找这个问题的解决方案,但没有成功;尽管我已经尝试了各种建议,但我将在下面详细说明这些建议。
我创建了一个非常小且简单的示例项目来测试渲染 Tiled map 并设置带有视口(viewport)的相机和一些简单的输入处理,以便我可以使用 WASD 在 map 上“平移”。问题是,当我尝试在 map 周围平移时, map 会产生奇怪的效果。这些包括:
- 瓷砖“挥手”。我的意思是当我向上/向下滚动或在屏幕上滚动时会出现“波浪形”
- 故障/卡顿屏幕。相机有时会显得不流畅。
- 瓷砖变化,(例如,当移动相机时,黄色瓷砖上的黑条将在侧面或顶部有一个不同颜色的黄色像素。这些“额外”像素位于哪一侧取决于方向相机移动)。我认为这称为纹理渗色,但我不确定。
我尝试过的事情:
- 用相同颜色的像素填充所有方 block (这消除了 map 上的黑色水平线)
- 将过滤器设置为线性/最近(尝试所有组合)
- 玩转视口(viewport)
- 改变相机的速度
有没有人知道可能出了什么问题?在继续之前,我只是不想确保我了解如何正确渲染 map 和正确移动相机而没有任何问题。
确切代码:
public class GameScreen implements Screen {
final Alpha game;
private OrthographicCamera camera;
private FitViewport viewport;
private TiledMap map;
private OrthogonalTiledMapRenderer renderer;
private Rectangle player;
public GameScreen(final Alpha game) {
this.game = game;
camera = new OrthographicCamera();
viewport = new FitViewport(800, 480, camera);
TmxMapLoader.Parameters params = new TmxMapLoader.Parameters();
params.textureMinFilter = Texture.TextureFilter.Nearest;
params.textureMagFilter = Texture.TextureFilter.Linear;
map = new TmxMapLoader().load("simple_padded_same_color.tmx");
renderer = new OrthogonalTiledMapRenderer(map);
player = new Rectangle(32,32,32,32);
}
@Override
public void render(float delta) {
camera.update();
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
// handle input
if (Gdx.input.isKeyPressed(Input.Keys.A)) {
player.setX(player.getX() - 200 * delta);
}
if (Gdx.input.isKeyPressed(Input.Keys.D)) {
player.setX(player.getX() + 200 * delta);
}
if (Gdx.input.isKeyPressed(Input.Keys.W)) {
player.setY(player.getY() + 200 * delta);
}
if (Gdx.input.isKeyPressed(Input.Keys.S)) {
player.setY(player.getY() - 200 * delta);
}
camera.position.set(player.getX(), player.getY(), 0);
renderer.setView(camera);
renderer.render();
}
@Override
public void resize(int width, int height) {
viewport.update(width, height);
}
@Override
public void show() {
}
@Override
public void hide() {
}
@Override
public void pause() {
}
@Override
public void resume() {
}
@Override
public void dispose() {
map.dispose();
renderer.dispose();
}
}
最佳答案
渲染函数应该是这样的
@Override
public void render(float delta) {
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
// force a constant delta
float gameDelta = 0.1f;
// handle input
if (Gdx.input.isKeyPressed(Input.Keys.A)) {
player.setX(player.getX() - 200 * gameDelta);
}
if (Gdx.input.isKeyPressed(Input.Keys.D)) {
player.setX(player.getX() + 200 * gameDelta);
}
if (Gdx.input.isKeyPressed(Input.Keys.W)) {
player.setY(player.getY() + 200 * gameDelta);
}
if (Gdx.input.isKeyPressed(Input.Keys.S)) {
player.setY(player.getY() - 200 * gameDelta);
}
// set camera position first
camera.position.set(player.getX(), player.getY(), 0);
// update camera
camera.update();
// then set the view
renderer.setView(camera);
// last render
renderer.render();
}
首先,您需要在设置新位置后更新相机。然后,尝试使用常量增量而不是实际增量,这将导致奇怪的相机移动,因为 libgdx 增量表示两帧之间的时间量并且不是常量。这应该会消除您在游戏中的波浪效果。
要了解您的增量问题,我建议阅读这篇文章 http://gameprogrammingpatterns.com/game-loop.html
理想情况下,您将使用一个实体系统框架和一个特定的 PhysicSystem
和一个 MotionSystem
来计算您的玩家移动并将玩家位置计算与渲染循环分离。
Libgdx 附带 Ashley , 你也可以看看 Artemis-odb这也是一个很棒的项目,在我看来比 Ashley 更完整。
关于camera - LibGDX 平铺 : Moving camera causes tiles to stutter/blur/wave,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45685465/