/// <summary> /// 初始化游戏状态机 /// </summary> /// <returns></returns> public xc.Machine.State InitFSM() { m_GameMachine = new xc.Machine(); xc.Machine.State init_state = new xc.GameInitState(m_GameMachine); XLua.LuaFunction initFSMFunc = LuaScriptMgr.Instance.GetLuaFunction("Main_InitFSM"); if (initFSMFunc != null) { initFSMFunc.Call(m_GameMachine, init_state); } m_GameMachine.SetCurState(init_state); return(init_state); }
/// <summary> /// 初始化状态机 /// </summary> void InitMachine() { m_Machine = new Machine(); m_InitState = new xc.Machine.State((uint)EFSMState.DS_Init, m_Machine); m_NormalState = new xc.Machine.State((uint)EFSMState.DS_Normal, m_Machine); m_ReconnectState = new xc.Machine.State((uint)EFSMState.DS_Reconnect, m_Machine); m_FailState = new xc.Machine.State((uint)EFSMState.DS_Fail, m_Machine); //// 构建状态图 m_InitState.AddTransition((uint)EFSMEvent.DE_ReconnectSucc, m_NormalState); // 进入游戏 m_InitState.AddTransition((uint)EFSMEvent.DE_NetDisconnnect, m_ReconnectState); // 进入游戏前,如果附链接断开的话,也需要重连 m_InitState.AddTransition((uint)EFSMEvent.DE_CannotReconnect, m_FailState); // 不进行断线重连 m_NormalState.AddTransition((uint)EFSMEvent.DE_NetDisconnnect, m_ReconnectState); // 网络断开 m_NormalState.AddTransition((uint)EFSMEvent.DE_CannotReconnect, m_FailState); // 不进行断线重连 m_NormalState.AddTransition((uint)EFSMEvent.DE_Reset, m_InitState); // 重新登录 m_ReconnectState.AddTransition((uint)EFSMEvent.DE_ReconnectSucc, m_NormalState); // 断线重连成功 m_ReconnectState.AddTransition((uint)EFSMEvent.DE_ReconnectFail, m_FailState); // 断线重连失败 m_ReconnectState.AddTransition((uint)EFSMEvent.DE_CannotReconnect, m_FailState); // 不进行断线重连 m_ReconnectState.AddTransition((uint)EFSMEvent.DE_Reset, m_InitState); // 重连过程中取消 m_FailState.AddTransition((uint)EFSMEvent.DE_Retry, m_ReconnectState); m_FailState.AddTransition((uint)EFSMEvent.DE_Reset, m_InitState); /// 设置Enter/Exit/Update State的函数 m_NormalState.SetEnterFunction(EnterState_Normal); m_NormalState.SetUpdateFunction(UpdateState_Normal); m_NormalState.SetExitFunction(ExitState_Normal); m_ReconnectState.SetEnterFunction(EnterState_Reconnect); m_ReconnectState.SetUpdateFunction(UpdateState_Reconnect); m_ReconnectState.SetExitFunction(ExitState_Reconnect); m_FailState.SetEnterFunction(EnterState_FailState); m_FailState.SetUpdateFunction(UpdateState_FailState); m_Machine.SetCurState(m_InitState); }