点击主页按钮时,libGDX纹理消失

时间:2017-06-10 14:31:29

标签: java android libgdx

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

3 个答案:

答案 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)

是的,我以前遇到过同样的问题 我所做的是在onPause(),当你按下主页按钮时调用它,我销毁了所有资产引用 然后在onResume()中,当你回来时调用它,我再次重新分配资产。

答案 2 :(得分:0)

当您按下Android上的主页按钮时,

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;
}