LibGDX:使用平铺地图实现视差效果

3
需要在使用LibGDX和tiled map的游戏中实现视差效果。背景应该以不同的速度移动,而前景则保持不变。在文档https://github.com/libgdx/libgdx/wiki/Tile-maps中提到:

通过分别渲染每个图层并为每个图层修改视图,您还可以实现视差效果。

当前实现:使用PlayScreenVariantOne一切正常,但是背景与前景以相同的速度移动。

public class PlayScreenVariantOne implements Screen {

    private TextureAtlas atlas;
    private OrthographicCamera gameCam;
    private Viewport viewport;
    private TmxMapLoader mapLoader;
    private TiledMap map;
    private OrthogonalTiledMapRenderer renderer;
    ...

    // ...
    // ... bla-bla-bla...
    // ...
    @Override
    public void render(float delta) {
        update(delta);
        Gdx.gl.glClearColor(0, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        renderer.setView(gameCam);
        renderer.render();

        game.batch.setProjectionMatrix(gameCam.combined);
        game.batch.begin();

        player.draw(game.batch);
        game.batch.end();
        hud.stage.draw();

    }
 }

视差实现: 使用PlayScreenVariantTwo将前景和背景以相同速度呈现。视差效果无法工作! :*(

public class PlayScreenVariantTwo implements Screen {

    private TextureAtlas atlas;
    private OrthographicCamera gameCam;
    private Viewport viewport;
    private TmxMapLoader mapLoader;
    private TiledMap map;
    private OrthogonalTiledMapRenderer renderer;
    ...

    // ...
    // ... bla-bla-bla...
    // ...
    @Override
    public void render(float delta) {
        update(delta);
        Gdx.gl.glClearColor(0, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        int[] backgroundLayers = { 7 };
        int[] ground = { 9 };

        renderer.setView(gameCam.combined, (gameCam.position.x - gameCam.viewportWidth / 2 - 2), gameCam.position.y - gameCam.viewportHeight / 2, gameCam.viewportWidth, gameCam.viewportHeight);
        renderer.render(backgroundLayers);

        renderer.setView(gameCam.combined, (gameCam.position.x - gameCam.viewportWidth / 2) / 10, gameCam.position.y - gameCam.viewportHeight / 2, gameCam.viewportWidth  * 10, gameCam.viewportHeight);
        renderer.render(ground);

        game.batch.setProjectionMatrix(gameCam.combined);
        game.batch.begin();

        player.draw(game.batch);
        game.batch.end();

        hud.stage.draw();

    }
 }
1个回答

0
你尝试过用因子简单地将背景的X(或Y,任何你需要的)坐标乘起来吗?
  renderer.setView(gameCam.combined, (gameCam.position.x*0.5 - gameCam.viewportWidth / 2 - 2), gameCam.position.y - gameCam.viewportHeight / 2, gameCam.viewportWidth, gameCam.viewportHeight);

或者

  renderer.setView(gameCam.combined, (gameCam.position.x - gameCam.viewportWidth / 2 - 2)*0.5, gameCam.position.y - gameCam.viewportHeight / 2, gameCam.viewportWidth, gameCam.viewportHeight);

我添加了“*0.5”,这样背景就会移动两倍慢。不确定哪一行会给你更好的结果 - 你必须自己尝试,但这就是想法 - 乘以背景坐标,X或Y,哪一个需要设置不同的速度。

相机仍以相同速度移动,但切掉了一半的背景。用于背景的相机只显示图层的一半。 - Lugaru
第二个变量给出了完全相同的结果,就像我想要的那样 - 两个摄像头以相同的速度移动。 - Lugaru

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接