首页 文章

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

提问于
浏览
3

我正在使用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 回答

  • 2

    令人感到有意思的是,我今天处理同样的问题,每个纹理(演员)在简历之后仍然在屏幕上,但不是主要的演员,而是正在移动的人(在我的情况下是主演员) . 经过几个小时的调试后,我发现当游戏状态在暂停和恢复之间发生变化时,渲染方法(我看起来像这样)将为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是从上次渲染开始经过的时间 . 显然没有时间从暂停到恢复,因此在演员更新链中,我正在更新我的主要演员

    velocity.scl(deltaTime);
     position.add(MOVEMENT * deltaTime, velocity.y);
    

    在恢复后的下一个渲染中传递0,因此NaN(非数字) .

    无论如何不确定是否有更好的方法去做或不做但这就是我做的,在我的主演员更新方法中简单检查零deltaTime并用非常小的数量替换 .001f :(请在后续更新deltaTime中注意不会是零,这个如果只能在恢复之后被调用一次

    public void update(float deltaTime) {
                if (deltaTime <= 0) {
                    deltaTime=.001f;
                }
            velocity.scl(deltaTime);
            position.add(MOVEMENT * deltaTime, velocity.y);
    ...
    }
    
  • 0

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

  • 0

    当你按下Android上的主页按钮时, render() 方法会继续调用,这样你的玩家位置似乎会随着重力继续更新,所以当你恢复游戏时你无法在屏幕上看到你的玩家所以在位置更新代码上使用一个标志并在 pause() 中更改标志和 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;
    }
    

相关问题