public void ChangeStartButton(GameServerState state) { switch (state) { case GameServerState.Off: ServerStartButton.Content = "启动服务端"; ServerStartButton.IsEnabled = true; break; case GameServerState.Starting: ServerStartButton.Content = "启动中"; ServerStartButton.IsEnabled = false; break; case GameServerState.Running: ServerStartButton.Content = "关闭服务端"; ServerStartButton.IsEnabled = true; break; case GameServerState.Stopping: ServerStartButton.Content = "关闭中"; ServerStartButton.IsEnabled = false; break; } }
/// <summary> /// Perform a transion between states. /// </summary> /// <param name="transEvent">An event that is occuring when a packet arrives.</param> /// <param name="packet">The packet received over the network.</param> public void DoTransition(GameServerTransition transEvent, GameData packet) { Tuple<GameServerState, TransitionAction> transition = null; try { transition = TransitionTable[new Tuple<GameServerState,GameServerTransition>(CurrentState,transEvent)]; transition.Item2(packet); CurrentState = transition.Item1; } catch (Exception error) { Debug.WriteLine("You managed to break the GameServerStateMachine. Congratulations, asshole: {0}", new Object[] {error.Message}); Debug.WriteLine("Violating Transition: {0} - {1} - {2}",new Object[] {CurrentState,transEvent,packet}); throw error; } return; }
/// <summary> /// Register a new transition inside the state machine. /// </summary> /// <param name="previousState">The state being transitioned out of.</param> /// <param name="eventPacket">The type of packet received over the network.</param> /// <param name="nextState">The state to transition into.</param> /// <param name="action">An action to perform before transitioning.</param> public void RegisterTransition(GameServerState previousState, GameServerTransition transEvent, GameServerState nextState, TransitionAction action) { TransitionTable.Add(new Tuple<GameServerState, GameServerTransition>(previousState, transEvent), new Tuple<GameServerState, TransitionAction>(nextState, action)); return; }
/// <summary> /// Create a new NetStateMachine. /// </summary> /// <param name="startingState">The state to begin the NetStateMachine in.</param> public GameServerStateMachine(GameServerState startingState) { CurrentState = startingState; TransitionTable = new Dictionary<Tuple<GameServerState,GameServerTransition>,Tuple<GameServerState,TransitionAction>>(); return; }
protected virtual void OnGameServerState(bool isServerAvailable) { GameServerState?.Invoke(new ServerEventArgs(isServerAvailable)); }