【问题标题】:Java LibGDX sprite moving twice as fast as cameraJava LibGDX sprite 的移动速度是相机的两倍
【发布时间】:2017-08-21 17:10:22
【问题描述】:

所以我有一个 extends ApplicationAdapter implements InputProcessor 的类,当你在屏幕上拖动时会执行以下操作。

@Override
public boolean touchDragged(int screenX, int screenY, int pointer) {

    float x = Gdx.input.getDeltaX();
    float y = Gdx.input.getDeltaY();

    if (Store.isGameState) {
        Store.Entity.player.setxMove(x);
        Store.Entity.player.setyMove(-y);
    }
    return true;
}

在我的播放器类中,我有一个更新方法,它执行以下操作:

    @Override
    public void update() {
        x += xMove;
        y += yMove;
        Store.Camera.Camera.position.set(Store.Entity.player.getXPos() + Store.Entity.player.getWidth() / 2, Store.Entity.player.getYPos() + Store.Entity.player.getHeight() / 2, 0);
        Store.Camera.Camera.update();
    }

和一个渲染方法是:

public void render(SpriteBatch SB) {
    SB.begin();
    Store.Entity.sprite.setPosition(Store.Entity.player.getXPos(), Store.Entity.player.getYPos());
    Store.Entity.sprite.draw(SB);
    SB.end();
}

总之,相机会移动,我的精灵也会移动。然而,我的精灵并没有以与我的相机相同的速度移动,我无法终生弄清楚为什么会这样。精灵的移动速度大约是相机的两倍,并且没有以我理想中的玩家为中心。

编辑:

所以在我的 GameState 中,我有以下内容:

package com.imjoshscott.dataria.states;

import com.imjoshscott.dataria.Game;
import com.imjoshscott.dataria.Store;

public class GameState extends State {

    public GameState(Game game) {
        super(game);
        Store.isGameState = true;
        Store.Entity.getPlayer(game, Store.Entity.getSprite());
        Store.Graphics.getSpriteBatch();
        Store.Graphics.getTiledMap();
        Store.Graphics.getTiledMapRenderer();
        Store.Camera.getCamera();
        Store.Camera.getHudCamera();
        Store.Camera.Camera.setToOrtho(false, Game.GAME_WIDTH, Game.GAME_HEIGHT);
        Store.Camera.HudCamera.setToOrtho(false, Game.GAME_WIDTH, Game.GAME_HEIGHT);
        Store.Camera.Camera.viewportHeight = Game.GAME_HEIGHT / 2.5f;
        Store.Camera.Camera.viewportWidth  = Game.GAME_WIDTH / 2.5f;
    }

    @Override
    public void update() {
        Store.Graphics.tiledMapRenderer.setView(Store.Camera.Camera);
        Store.Entity.player.update();
    }

    @Override
    public void render() {
        Store.Graphics.tiledMapRenderer.render();

        Store.Entity.player.render(Store.Graphics.SB);
    }

}

Store 类中的 Camera 东西:

public static class Camera {
    public static OrthographicCamera Camera;
    public static OrthographicCamera HudCamera;

    public static OrthographicCamera getCamera() {
        if(Camera == null)
            Camera = new OrthographicCamera();
        return Camera;
    }
    public static OrthographicCamera getHudCamera() {
        if(HudCamera == null)
            HudCamera = new OrthographicCamera();
        return HudCamera;
    }
}

编辑:显示更新和渲染方法

public void update() {
    moveCreature();
    Store.Entity.sprite.setPosition(Store.Entity.player.getXPos(), Store.Entity.player.getYPos());
    Store.Camera.Camera.position.set(Store.Entity.player.getXPos(), Store.Entity.player.getYPos(), 0);
    Store.Camera.Camera.update();
    xMove = 0f;
    yMove = 0f;
}


public void render(SpriteBatch SB) {
    SB.begin();
    Store.Entity.sprite.draw(SB);
    SB.end();
}

【问题讨论】:

  • 您的问题有不一致的地方。标题说相机的移动速度是玩家的两倍,但在你说精灵的移动速度是相机的两倍?
  • 我的错,编辑为正确。精灵的移动速度是相机的两倍。
  • 你用的是什么类型的相机?
  • LibGDX 的OrthographicCamera
  • 能否请您提供初始化相机的代码?有可能与此有关。

标签: java android libgdx


【解决方案1】:

更新我之前的回答不正确,在查看和检查项目后,我看到了 GameState 类的 render() 方法(在环顾了几个地方但没有骰子,如果有的话这个非常奇怪的问题我会再次指向这个)。

public void render() {
    Store.Graphics.tiledMapRenderer.render();

    Store.Entity.player.render(Store.Graphics.SB);
}

我们只需要添加一件事来解决非常奇怪的问题就是添加以下代码

Store.Graphics.SB.setProjectionMatrix(Store.Camera.Camera.combined);

所以我们会有

public void render() {
    Store.Graphics.SB.setProjectionMatrix(Store.Camera.Camera.combined);
    Store.Graphics.tiledMapRenderer.render();

    Store.Entity.player.render(Store.Graphics.SB);
}

这意味着我们需要将投影矩阵设置为当前活动的SpriteBatch 以正确渲染内容。甚至在渲染图块之前设置它也是安全的,因为它使用与播放器相同的相机。

【讨论】:

  • 非常感谢您的回复,它的工作原理是将播放器相机连接到播放器并且不再以单独的速度移动。但是,播放器被卡在屏幕的左下角,并且不在相机的中心。
  • 哦@JoshScott,我又仔细检查了一遍。实际上,我们甚至不需要像我提供给您的代码那样的一半视口大小偏移。我测试了代码,它工作正常。您是否使用Sprite 类来代表玩家?你说相机不是你想要的中心,你得到了多少或什么结果?
  • 是的,我正在使用 Sprite 来渲染玩家的图像。角色精灵位于设备的左下角。
  • @JoshScott 您的原始代码应该可以按预期工作,而无需再次偏移一半的视口。如果您使用原始解决方案,您说它没有居中,您能详细说明一下吗?
  • 我在问题中提供的初始代码让相机单独移动到精灵。相机在一定程度上跟随精灵,但精灵的移动速度大约是相机的两倍,看起来它们在不同的图层上/在某种程度上存在视差。
猜你喜欢
  • 1970-01-01
  • 2014-07-18
  • 2018-06-23
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 2011-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多