我正在使用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);

最佳答案

足够有趣的是,我今天正在处理同一问题,恢复后的每个纹理(演员)都保留在屏幕上,而不是正在移动的主要演员(在我的情况下为主要演员)。经过数小时的调试,我发现当游戏状态在暂停和恢复之间变化时,render方法(我的样子)将为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(非数字)。

无论如何,不​​确定是否有更好的方法可以解决此问题,但这就是我的方法,在我的主要演员更新方法中简单检查零增量时间,并替换为极少量的 .001f :(请注意后续更新deltaTime将不会为零,如果语句仅在恢复后恰好被调用一次,则此值为零)
     public void update(float deltaTime) {
            if (deltaTime <= 0) {
                deltaTime=.001f;
            }
        velocity.scl(deltaTime);
        position.add(MOVEMENT * deltaTime, velocity.y);
...
}

07-25 23:51