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