因此,我正在尝试使用UI创建基于文本的游戏(与基于文本的真实解析和所有有趣的东西相反),这基本上是一个RPG。为此,游戏中可能会发生一系列不同的事件(但不保证会发生,也不会以任何整体顺序发生),我想知道最有效的编码方式。
目前,我的想法是拥有一个名为GameState的静态类,除了其他信息之外,还有一个数组和一个枚举。对于会话或多选项事件选择,数组可能是字节,其中0表示事件尚未发生,然后数字1 - X表示哪个选项超出选择X可能。像这样:
public enum GameEvents{
Event 1,
Event 2,
Event 3 };
public static byte[] GameEventStates = new byte[Enum.GetNames(typeof(GameEvents)).Length];
所以在事件和事情中,我可以做以下几行:
if(GameState.GameEventStates[GameState.GameEvents.Event2] == 1)
{
Stuff Here;
}
或
GameState.GameEventStates[GameState.GameEvents.Event4] = 1;
(注意:对于严格的“已经看过”的事件,没有看过它就会是0,而看过它就是1)。
但是,部分原因只是让人感到有些强迫,就像有一种更优雅的方式,我根本无法想到。我不知道它会是什么,但仍然允许我
A)具有全局访问权限,可以在事件发生时更改值,并允许对其发生进行检查,
B)随着游戏内容的不断扩展,轻松添加更多活动,
C)轻松保存并从保存文件加载值。
这真的是最好的方法吗?我是第一个承认我能够提出......“创造性”的方法,这些方法对于解决问题并不是那么有用。真的很感激第二意见。提前谢谢。
答案 0 :(得分:3)
这看起来像是Observer pattern的经典示例。
您需要创建将保持游戏状态的类,如果状态发生更改,它将通知所有订阅者。
public class GameStateManager
{
public GameStateFileReader fileReader = new GameStateFileReader() //this class can read gamestate to file, and save it back
public void SaveState() {//save using fileReader}
public void LoadState() {//load}
public event Action<GameEvents> StateChanged;
}
并且Game类可以订阅StateChanged事件:
gameStateManager.StateChanged += OnStateChanged;
//....
public void OnStateChanged(GameEvents event)
{
//react on new game state
}
一些游戏代理可以改变游戏状态(例如,用户打开了一些愤怒的老板的门),因此GameStateManager应该提供一种改变游戏状态的方法。
public void SetNewState (GameEvents newEvent)
{
//Save new state to some Property
//...
//and notify everybody about new state
if(StateChanged != null)
{
StateChanged(newEvent);
}
}
如果某个班级想要被告知游戏状态被某人更改,那么它也应该订阅此事件。
我不想让你与Action
混淆。你可以在这里阅读它们:
Explaining action
此外,还有一些关于事件的信息: Events in C#