我正在处理设计问题。
实际上,我有一个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方法中,我可以检查游戏的当前状态是否正在运行。如果没有,他们就不采取行动。
答案 0 :(得分:1)
尽管我了解您的情况,但您要做的是从GameManager类启用和禁用阶段更新,GameManager类的对象在屏幕中实例化。舞台是在屏幕而不是GameManager。如果我找到了你,那么最简单的解决方案就是在屏幕上创建一个public static boolean TRANSITION = false
。
通过Screen.TRANSITION = true/false
启用/禁用游戏管理员课程中的此功能。因此,stage.act()或任何你想要在加载关卡时停止的代码都可以被扼杀。在屏幕类中添加此项,例如
if(!TRANSITION)
{ //code
stage.act();
}
答案 1 :(得分:1)
我认为您的课程之间的关系无效。目前,您的GameManager
归Screen
所有。但我倾向于认为他们应该在你的班级设计表中处于同一水平。
我可以提出以下建议:
Coordinator
。它将同时拥有Screen
和GameManager
。Coordinator
可以订阅由Screen
和GameManager
现在,每当GameManager
认为游戏情况发生变化时,就会发生一些事件。 Coordinator
将决定做什么 - 打电话给屏幕或不打电话。反之亦然。
此外,我认为您的GameManager
现在处理得太多,应该转换为模块,因为您正朝着God Object反模式方向前进。这意味着可以改变整个班级的设计。