屏幕或其他课程中的游戏逻辑?

时间:2015-11-25 20:58:23

标签: libgdx

我正在处理设计问题。

实际上,我有一个GameManager类,由Screen类实例化和更新。正如其名称所示,GameManager类包含游戏逻辑(级别之间的转换,更新其他管理器,将数据保持为分数,金钱等等)和游戏状态(暂停,运行,游戏结束,转换)。

开发级别之间的过渡机制,在过渡阶段运行时,游戏不应该更新,但是我不能从GameManager那样做,因为阶段在Screen类中更新。

我想到了两个解决方案:

1)我在屏幕类中移动所有游戏逻辑,因此,在渲染方法中,如果我处于过渡状态,我可以轻松地停止更新阶段。

2)了解如何在Libgdx中使用有限状态机

我该怎么办?谢谢你的帮助。

更新

我解决了(但没有避免糟糕的设计)创建这个类:

public class GameStateManager {

    public static enum GameState {
        RUNNING, PAUSE, GAME_OVER, LEVEL_TRANSITION;
    }

    private static GameState currentGameState;

    public static GameState getCurrentGameState() {
        return currentGameState;
    }

    public static void setCurrentGameState(GameState gameState) {
        currentGameState = gameState;
    }
}

通过这种方式,在Actors的act方法中,我可以检查游戏的当前状态是否正在运行。如果没有,他们就不采取行动。

2 个答案:

答案 0 :(得分:1)

尽管我了解您的情况,但您要做的是从GameManager类启用和禁用阶段更新,GameManager类的对象在屏幕中实例化。舞台是在屏幕而不是GameManager。如果我找到了你,那么最简单的解决方案就是在屏幕上创建一个public static boolean TRANSITION = false

通过Screen.TRANSITION = true/false启用/禁用游戏管理员课程中的此功能。因此,stage.act()或任何你想要在加载关卡时停止的代码都可以被扼杀。在屏幕类中添加此项,例如

if(!TRANSITION)
{   //code
    stage.act();
}

答案 1 :(得分:1)

我认为您的课程之间的关系无效。目前,您的GameManagerScreen所有。但我倾向于认为他们应该在你的班级设计表中处于同一水平。

我可以提出以下建议:

  • 创建新课程Coordinator。它将同时拥有ScreenGameManager
  • 为您的班级进行简单的事件处理,以便Coordinator可以订阅由ScreenGameManager
  • 触发的事件

现在,每当GameManager认为游戏情况发生变化时,就会发生一些事件。 Coordinator将决定做什么 - 打电话给屏幕或不打电话。反之亦然。

此外,我认为您的GameManager现在处理得太多,应该转换为模块,因为您正朝着God Object反模式方向前进。这意味着可以改变整个班级的设计。