我正在使用libGDX开发Android手机游戏。我注意到当我点击主页按钮然后返回游戏时,播放器已经消失。连接到舞台的所有其他演员都存在,当我删除移动播放器的代码时,它也被绘制。它只在移动时消失。我做了很多调试,有时位置似乎正确地更新,但玩家是看不见的,但有时它只是NaN。例如,我试图在暂停功能中保存位置和速度,并在恢复功能中为玩家提供它们,但没有任何帮助。
这就是我在播放器更新功能中所做的事情:
// When these lines are removed, the app works perfectly
velocity.add(0.0f, GRAVITY);
velocity.scl(deltaTime);
position.add(velocity);
velocity.scl(1/deltaTime);
如果我在恢复功能中重新创建播放器
,它甚至无法提供帮助player2 = new Player(resourceManager.getRegion("player"), new Vector2(320.0f, 350.0f), 300.0f);
最后,我尝试创建完全不同的播放器对象,在单击主页按钮后绘制。它是可见的,但不会移动:
player2 = new Player(resourceManager.getRegion("player"), new Vector2(320.0f, 350.0f), 300.0f);
答案 0 :(得分:3)
毫无疑问,我今天处理同样的问题,每个纹理(演员)在恢复后仍然在屏幕上,但不是主要的演员是移动的人(在我的情况下是主演员)。经过几个小时的调试后,我发现当游戏状态在暂停和恢复之间发生变化时,渲染方法(我看起来像这样)将为deltaTime获得0:
@Override public void render(float deltaTime) {
update(delta);
spriteBatch.setProjectionMatrix(cam.combined);
spriteBatch.begin();
spriteBatch.draw(background, cam.position.x - (WIDTH / 2), 0, WIDTH, HEIGHT);
....
spriteBatch.end();}
deltaTime是从上次渲染开始经过的时间。 显然没有时间从暂停到恢复因此0。 在演员更新链中,我正在更新我的主演员
velocity.scl(deltaTime);
position.add(MOVEMENT * deltaTime, velocity.y);
在恢复后的下一个渲染时传递0,因此NaN(非数字)。
无论如何不确定是否有更好的方法可以解决这个问题,但这就是我的做法,在我的主演员更新方法中简单检查零deltaTime并用非常小的数量替换 .001f < / strong> :(请注意在后续更新deltaTime中不会为零,如果只能在恢复后调用一次,那么这就是
public void update(float deltaTime) {
if (deltaTime <= 0) {
deltaTime=.001f;
}
velocity.scl(deltaTime);
position.add(MOVEMENT * deltaTime, velocity.y);
...
}
答案 1 :(得分:0)
答案 2 :(得分:0)
render()
方法会继续调用,这样您的玩家位置似乎会随着重力继续更新,所以当您恢复游戏时,您无法在屏幕上看到您的玩家,所以请使用位置更新代码上的标记,并在pause()
接口的resume()
和ApplicationListener
方法中更改标记。
enum GameState{
PAUSED, RESUMED
}
GameState gameState;
@Override
public void create() {
gameState=GameState.RESUMED;
...
}
@Override
public void render() {
Gdx.gl.glClearColor(1,1,1,1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
if(gameState==GameState.RESUMED) {
velocity.add(0.0f, GRAVITY);
velocity.scl(deltaTime);
position.add(velocity);
velocity.scl(1/deltaTime);
}
}
@Override
public void pause() {
gameState=GameState.PAUSED;
}
@Override
public void resume() {
gameState=GameState.RESUMED;
}