首页 文章

GameStateManager LibGDX

提问于
浏览
3

我用libgdx开始了一个项目,我有一个GameStateManager用于我的GameStates菜单和播放 .

如果我运行项目它显示菜单,然后我可以单击按钮打开Play GameState . 问题是,当我结束游戏时,它应该再次显示菜单状态,但我得到一个黑屏 . 我测试了是否启动了render()方法(使用System.out ...)并且Menu中的render()方法正在启动 .

当我“重新打开”菜单状态时,为什么我会出现黑屏,我并不感到害羞 . 也许它不起作用,因为我在Play中使用Box2D,但我不知道 .

这里有一些代码:

这是播放中的方法,如果播放器在最后,则应打开菜单:

public void playerEnded() {

    gsm.setState(GameStateManager.MENU);

}

也许你可以告诉我,如果我必须结束box2d的事情 . 我希望有人可以帮助我,如果你想要更多的代码 - 没问题 .

3 回答

  • 2

    您的自定义GameStateManager应该扩展此类:

    http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/Game.html

    要更改屏幕,您应该使用Game.setScreen(屏幕屏幕)

    每个不同的屏幕应该是Screen的实现 .

    因此它在我的libGDX项目中的工作方式是GameScreen扩展了Screen,而MenuScreen扩展了Screen . 这样我可以改变什么画在什么屏幕上 .

    这一切都可以追溯到接口和多态,所以如果你没有得到这些概念,只需给它一个快速的谷歌,你就会知道你需要做什么 .

  • 1

    你可能正在定义一个

    Stack<GameState> gameStates
    

    在你的GameStateManager中管理你的GameStates .

    如果是这样,你可以阅读使用Stack的内容 . 无论如何,这里有什么可以解决你的问题:我假设你的GamestateManager中有以下结构;

    public void setState(int state){
        popState();
        pushState(state);
    }
    public void pushState(int state){
        gameStates.push(getState(state));
    }
    public void popState(){
        GameState g = gameStates.pop();
        g.dispose();
    }
    
    private GameState getState(int state){
        if(state == MENU) return new Menu(this);
        if(state == PLAY) return new Play(this);
        return null;
    }
    

    当您在Menu-GameState中单击开始按钮时,您将要启动Play-GameState . 现在,而不是使用setState方法,它删除顶部状态(弹出),然后推送新状态 . 尝试仅使用pushState方法 . 这将把你的新Play-GameState置于GameState-Stack中的Menu-GameState之上 .

    当你完成游戏后,你可以弹出你的Play-GameState并重新出现Menu-GameState . 但是这次它不会实例化一个新的Object,而是重用你在开始游戏时使用的那个 .

    // in the Menu-GameState:
    public void startPlay() {
        gsm.pushState(GameStateManager.PLAY);
    }
    
    // in the Play-GameState:
    public void playerEnded() {
        gsm.popState();
    }
    

    这不会影响游戏性能,因为您只使用位于堆栈顶部的GameState渲染和更新游戏,如下所示:

    public void update(float dt) {
        gameStates.peek().update(dt);
    }
    
    public void render() {
        gameStates.peek().render();
    }
    

    peek方法从Stack顶部获取GameState,但将其保留在那里 .

    唯一的缺点是Menu-Gamestate会在你的Play-State中留在内存中 .

    此外,如果此方法有效,您仍然可以按照自己的方式进行操作,但是应该检查Menu-GameState的实例化方式,并在实例化两次时确定问题 .

  • 0

    我在游戏中实现了类似的StageManager . 如果您在游戏中使用视口/摄像机,那么当您返回菜单状态时,视口仍可能设置为游戏状态的视口 .

    对于我的应用程序,我的State类有一个activate()方法,只要状态变为活动状态就会调用它:

    public void activate(){
      stage.getViewport().update(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
    }
    

相关问题