Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.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 如何让我的相机更新与我的播放器精灵相同的帧?_Java_Libgdx - Fatal编程技术网

Java 如何让我的相机更新与我的播放器精灵相同的帧?

Java 如何让我的相机更新与我的播放器精灵相同的帧?,java,libgdx,Java,Libgdx,在LibGDX中,我试图让我的正交摄影机在移动时跟随playersprite。当前,首先更新playersprite,然后在下一帧中相机更新到前一帧中playersprite的位置。以下是一个例子: 我已经尝试将gameMap.render(cam)移动到方法的底部,但它不仅不能解决我的问题,还将贴图纹理放置在playersprite上方,因此当playersprite移动到地图下方时,您将无法再看到它 以下是渲染playersprite和摄影机的代码: public void呈现(){ gl

在LibGDX中,我试图让我的正交摄影机在移动时跟随playersprite。当前,首先更新playersprite,然后在下一帧中相机更新到前一帧中playersprite的位置。以下是一个例子:

我已经尝试将gameMap.render(cam)移动到方法的底部,但它不仅不能解决我的问题,还将贴图纹理放置在playersprite上方,因此当playersprite移动到地图下方时,您将无法再看到它

以下是渲染playersprite和摄影机的代码:

public void呈现(){
glClearColor(0,0,0,1);
Gdx.gl.glClear(GL20.gl\u颜色\u缓冲\u位);
cam.viewportHeight=Gdx.graphics.getHeight()/3;
cam.viewportWidth=Gdx.graphics.getWidth()/3;
游戏地图渲染(cam);
gameMap.getTiledMapRenderer().getBatch().begin();
player.draw(gameMap.getTiledMapRenderer().getBatch());
gameMap.getTiledMapRenderer().getBatch().end();
cam.position.x=player.getX()+(player.getWidth()/2);
cam.position.y=player.getY()+(player.getHeight()/2);
cam.update();
}

通常,您希望将逻辑分为两部分:

  • 更新

  • 渲染

因此,在每个帧之前,您需要执行任何相关的计算。 您的相机当前更新较晚,因为它在游戏地图更新之前不会执行逻辑。 例如:

// Perform logic and update the state
public void Update () {
    Gdx.gl.glClearColor(0, 0, 0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

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

    gameMap.getTiledMapRenderer().getBatch().begin();

    cam.position.x = player.getX() + (player.getWidth() / 2);
    cam.position.y = player.getY() + (player.getHeight() / 2);
}

// Draw map
public void Render () {
    gameMap.render(cam);

    player.draw(gameMap.getTiledMapRenderer().getBatch());
    gameMap.getTiledMapRenderer().getBatch().end();

    cam.update();
}

我不熟悉您正在使用的框架,因此我无法判断这是否会运行,但在任何游戏开发情况下使用框架时,这就是您希望处理事情的方式。

就像Bradley说的,您应该将逻辑分为两部分:更新和渲染

创建一个
udpate()

public void update(){
    //Update camera position
    cam.position.x = player.getX() + (player.getWidth() / 2);
    cam.position.y = player.getY() + (player.getHeight() / 2);
    //apply all updates to the camera before this the changed position won't apply to the camera
    cam.update();
}

@Override
public void render() {
    //First call the update method we created
    update();

    //Clear the Screen
    Gdx.gl.glClearColor(0, 0, 0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    //Render
    gameMap.render(cam);

    gameMap.getTiledMapRenderer().getBatch().begin();
    player.draw(gameMap.getTiledMapRenderer().getBatch());
    gameMap.getTiledMapRenderer().getBatch().end();
}

你不需要打电话:

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

每一帧。在create()方法中调用它就足够了

这些方法所在的类正在扩展一个完全抽象的类ApplicationAdapter。该类不包含任何名为update()的方法。示例中的方法update()从未使用过。而且,如果我事先更新相机,我会得到同样的结果。抽象类不会阻止你实现自己的方法。我不是建议你在手之前更新相机,我是建议你在自己的线程中执行绘制地图和相机的所有逻辑,直到所有逻辑完成后再绘制。在同一线程中更新和绘制通常被认为是不好的做法。我会改变Main()函数调用update然后render,或者在render()的第一行调用update()。我想说的是,我相当肯定,只要使用LibGDX中的方法,您就可以实现我想要的。但在其他类(如Sprite和GameMap)中也有update()方法。也许我应该试着用一下。谢谢你的建议,从现在起我会这么做的。我猜这是因为gameMap.render()是在cam.update()之后调用的。目前,我也不必继续设置视口高度和宽度。但最后的3将最终是动态的,所以我必须能够在以后再次设置它。但现在你是对的。