如何让我的相机更新与我的玩家精灵相同的帧?
How do I get my camera to update the same frame as my player sprite?
在 LibGDX 中,我试图让 OrthographicCamera 在我四处移动时跟随玩家角色。目前,玩家角色首先被更新,然后在下一帧中相机更新到玩家角色在前一帧中的位置。这是一个例子:
https://i.imgur.com/wxJUizU.gifv
我试过将gameMap.render(cam)移动到方法的底部,但它不仅没有解决我的问题,而且还将地图纹理放在玩家角色之上,所以你不会当它在地图下方移动时,可以再看到玩家角色。
这是渲染玩家角色和相机的代码:
public void render () {
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.render(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();
}
通常,您希望将逻辑分为两部分:
更新
渲染
所以,在每一帧之前你要执行任何相关的计算。
您的相机当前更新较晚,因为它在 gameMap 更新后才执行逻辑。
例如:
// 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()
方法,将所有要更新的东西放在其中,并首先在 render()
方法中调用此方法:
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()方法中调用一个就够了
在 LibGDX 中,我试图让 OrthographicCamera 在我四处移动时跟随玩家角色。目前,玩家角色首先被更新,然后在下一帧中相机更新到玩家角色在前一帧中的位置。这是一个例子: https://i.imgur.com/wxJUizU.gifv
我试过将gameMap.render(cam)移动到方法的底部,但它不仅没有解决我的问题,而且还将地图纹理放在玩家角色之上,所以你不会当它在地图下方移动时,可以再看到玩家角色。
这是渲染玩家角色和相机的代码:
public void render () {
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.render(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();
}
通常,您希望将逻辑分为两部分:
更新
渲染
所以,在每一帧之前你要执行任何相关的计算。 您的相机当前更新较晚,因为它在 gameMap 更新后才执行逻辑。 例如:
// 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()
方法,将所有要更新的东西放在其中,并首先在 render()
方法中调用此方法:
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()方法中调用一个就够了