【问题标题】:LibGDX camera following player with TiledMap?使用 TiledMap 的 LibGDX 相机跟随播放器?
【发布时间】:2013-08-01 02:15:16
【问题描述】:

我正在尝试将相机设置为聚焦在中心的玩家身上,因为它会越过固定到位的 TiledMap。我正在为相机使用这个渲染代码:

OverworldWorld world;
Player player;
OrthographicCamera cam;
SpriteBatch batch;
TiledMap map;
TileAtlas tileAtlas;
TileMapRenderer tmr;

public Renderer(OverworldWorld world){
    this.world = world;

    world.setRenderer(this);

    width = Gdx.graphics.getWidth();
    height = Gdx.graphics.getHeight();

    new TiledLoader();
    map = TiledLoader.createMap(Gdx.files.internal("maps/island.tmx"));
    tileAtlas = new TileAtlas(map, Gdx.files.internal("maps/"));
    tmr = new TileMapRenderer(map, tileAtlas, 16, 16);

    cam = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
    cam.setToOrtho(false, width, height);
    cam.position.set(0, 0, 0);
    cam.update();

    batch = new SpriteBatch();
    batch.setProjectionMatrix(cam.projection);

    sr = new ShapeRenderer();


}

public void render(){
    Gdx.gl.glClearColor(0, 0, 0, 1);
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

    player = world.getPlayer();

    cam.position.set(player.getPosition().x, player.getPosition().y, 0);
    cam.update();

    tmr.getProjectionMatrix().set(cam.combined);

    Vector3 tmp = new Vector3();
    tmp.set(0, 0, 0);
    cam.unproject(tmp);
    tmr.render((int) tmp.x, (int) tmp.y, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());

结果是玩家被锁定在地图的左下角,移动玩家会使相机在地图上移动。这个动作非常基础:

player = world.getPlayer();
    switch(keycode){
    case Keys.W:
        player.getVelocity().y = 1;
        player.direction = "up";
        break;

并使用此更新玩家位置(这是 0.9.8 版本):

position.add(velocity.tmp().mul(Gdx.graphics.getDeltaTime() * speed));

是什么导致了这个问题,如何解决?

【问题讨论】:

  • 不知道为什么你的精灵没有移动,我正在处理它......但是如果你想让相机直接在玩家上方居中,你应该添加一半的宽度和一半的高度到他的位置并将其传递给相机,因为 LIBGDX 通常会从左下角向上渲染一个精灵。
  • 玩家开始时以摄像机为中心,但相对于地图始终处于同一位置,当玩家“移动”时,摄像机在地图上移动,使玩家偏离中心。

标签: java camera libgdx


【解决方案1】:

我会尽力解释我知道的一种实现方式,如果这没有帮助,很抱歉。

您需要能够让您的玩家获得当前的 XY。获取X(),获取Y()。您可以手动将其添加到您的播放器类中。一旦你有访问权限,你需要做的就是启动相机为空,并将相机位置设置为玩家的 XY、他的宽度、高度和一些小分区。这看起来像这样。

@Override
public void create() {      


    cam = new OrthographicCamera();


}

这将适用于 create()、resize() 或 show() 方法。

最后我们渲染相机并获取坐标。

@Override
public void render() {      
    Gdx.gl.glClearColor(0.294f, 0.294f, 0.294f, 1f);
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

    cam.position.set(viewer.getX() + viewer.getWidth() / 2, viewer.getY() + viewer.getHeight() / 2, 0);
    cam.viewportWidth = Gdx.graphics.getWidth() / viewer.getZoom();
    cam.viewportHeight = Gdx.graphics.getHeight() / viewer.getZoom();

    cam.update();

}

所以在简单的数学中。

(玩家当前 X + 玩家当前宽度 / 2) 对于 x 和 (玩家当前 Y + 玩家当前高度 / 2) 对于 y

之后的行是如何使用存储在播放器类中的浮点数来缩放相机的示例。

cam.viewportWidth = Gdx.graphics.getWidth() / viewer.getZoom();
    cam.viewportHeight = Gdx.graphics.getHeight() / viewer.getZoom();

使用此代码,您可以轻松地使相机随着角色速度的加快而放大和缩小。

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多