Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java LibGDX摄像机跟踪带有TiledMap的播放器?_Java_Camera_Libgdx - Fatal编程技术网

Java LibGDX摄像机跟踪带有TiledMap的播放器?

Java LibGDX摄像机跟踪带有TiledMap的播放器?,java,camera,libgdx,Java,Camera,Libgdx,我试图将相机设置为聚焦在中间的玩家身上,因为它经过固定到位的平铺贴图。我正在为相机使用以下渲染代码: OverworldWorld world; Player player; OrthographicCamera cam; SpriteBatch batch; TiledMap map; TileAtlas tileAtlas; TileMapRenderer tmr; public Renderer(OverworldWorld world){ this.world = world;

我试图将相机设置为聚焦在中间的玩家身上,因为它经过固定到位的平铺贴图。我正在为相机使用以下渲染代码:

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):


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

我将尽力解释我知道的实现这个问题的一种方法,如果这没有帮助,那么很抱歉

你需要能够让你的球员最新的XY。getX(),getY()。您可以手动将其添加到您的玩家类中。一旦你有了访问权限,你所需要做的就是启动相机清空,并将相机位置设置为玩家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为(玩家当前X+玩家当前宽度/2),Y为(玩家当前Y+玩家当前高度/2)

后面的几行是如何使用存储在player类中的float缩放相机的示例

cam.viewportWidth = Gdx.graphics.getWidth() / viewer.getZoom();
    cam.viewportHeight = Gdx.graphics.getHeight() / viewer.getZoom();
使用此代码,您可以轻松地使相机随着角色速度的提高而放大和缩小


我希望这能有所帮助。

不知道你的精灵为什么不移动,我正在努力。。。但是,如果您希望摄影机直接位于玩家上方,则应将其宽度和高度的一半添加到其位置,并将其传递给摄影机,因为LIBGDX通常从左下角向上渲染精灵。玩家开始位于摄影机上方的中心,但始终位于相对于地图的同一位置,并且当玩家“移动”,相机在地图上移动,使玩家偏离中心。
cam.viewportWidth = Gdx.graphics.getWidth() / viewer.getZoom();
    cam.viewportHeight = Gdx.graphics.getHeight() / viewer.getZoom();