camera - LibGDX 平铺 : Moving camera causes tiles to stutter/blur/wave

标签 camera libgdx textures rendering tiled

我已经尝试到处寻找这个问题的解决方案,但没有成功;尽管我已经尝试了各种建议,但我将在下面详细说明这些建议。

我创建了一个非常小且简单的示例项目来测试渲染 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/

相关文章:

android - 动画覆盖相机 Activity 预览

java - 单击一次广告即可打开数百个标签

java - Label.setScale 和 Label.setFontScale 之间的区别?

javascript - 如何使用加载的图像数据更新 ThreeJS 中的纹理?

c++ - SDL2 SIGSEGV 从表面创建纹理

ios - 相机设置逻辑 iOS

用于读取波前对象并将其渲染为 JPEG 文件的 Python 库

c++ - 颜色和纹理如何协同工作?

c# - Xamarin 设置相机分辨率

java - LibGDX 中的分屏