我正在使用 libGDX 为 Android 开发手机游戏。我注意到当我点击主页按钮然后返回游戏时,玩家已经消失了。舞台上的所有其他 Actor 都存在,当我删除移动玩家的代码时,它也会被绘制出来。它只有在移动时才会消失。我做了很多调试,有时位置似乎正确更新但播放器不可见,但有时只是 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);
即使我在 resume 函数中重新创建播放器也无济于事
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);
最佳答案
有趣的是,我今天遇到了同样的问题,恢复后每个纹理( Actor )都保留在屏幕中,但不是主要 Actor ,而是正在移动的 Actor (在我的例子中是主要 Actor )。经过几个小时的调试,我发现当游戏状态在暂停和恢复之间变化时,渲染方法(我的看起来像这样)的 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。 在 Actor 更新链中,我正在像这样更新我的主要 Actor
velocity.scl(deltaTime);
position.add(MOVEMENT * deltaTime, velocity.y);
在恢复后的下一个渲染中传递了 0,因此是 NaN(不是数字)。
无论如何不确定是否有更好的方法来解决这个问题,但我就是这样做的,在我的主要 Actor 更新方法中简单检查零增量时间并替换为非常小的数量 .001f :(请注意在后续更新中 deltaTime 不会为零,并且此 if 语句仅在恢复后调用一次)
public void update(float deltaTime) {
if (deltaTime <= 0) {
deltaTime=.001f;
}
velocity.scl(deltaTime);
position.add(MOVEMENT * deltaTime, velocity.y);
...
}
关于java - 点击主页按钮时 libGDX 纹理消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44474479/