using System; using Thousandto.Core.Support; using FLogger = UnityEngine.Gonbest.MagicCube.FLogger; namespace Thousandto.Code.Logic { /// <summary> /// 游戏数据状态的基础类 /// </summary> public class GameStateBase : IGameState { #region //私有变量 GameStateId _stateId = 0; //游戏状态参数 object _arg = null; //游戏数据状态的状态 GameStateStatus status = GameStateStatus.None; #endregion #region//属性 public object Arg { get { return _arg; } set { _arg = value; } } /// <summary> /// 获取状态的ID /// </summary> public GameStateId GameStateID { get { return OnGetStateID(); } } //获取当前是否位激活状态 public bool IsActived { get { return (status == GameStateStatus.Running || status == GameStateStatus.Entered); } } #endregion #region//构造函数 public GameStateBase(GameStateId id) { _stateId = id; } #endregion #region//公共函数 public int GetStateId() { return (int)_stateId; } /// <summary> /// 初始化状态 /// </summary> public void Load() { if (status == GameStateStatus.None) { status = GameStateStatus.Initialized; //FLogger.Log(string.Format("GameState Load: {0}", GameStateID)); try { OnLoad(); } catch (Exception e) { FLogger.LogException(e); } } } /// <summary> /// 释放状态 /// </summary> public void Release() { if (status != GameStateStatus.Destroied) { status = GameStateStatus.Destroied; //FLogger.Log(string.Format("GameState Release: {0}", GameStateID)); try { OnRelease(); } catch (Exception e) { FLogger.LogException(e); } } } /// <summary> /// 检查切换状态 /// </summary> /// <param name="state"></param> public bool Check(IGameState state) { bool ret = false; if (status == GameStateStatus.Initialized || status == GameStateStatus.Left) { try { ret = OnCheck(state); } catch (Exception e) { FLogger.LogException(e); } } return ret; } public void Enter() { status = GameStateStatus.Entered; //FLogger.Log(string.Format("GameState Enter: {0}", GameStateID)); try { OnEnter(); } catch (Exception e) { FLogger.LogException(e); } } public void Leave() { if (status == GameStateStatus.Running || status == GameStateStatus.Paused) { status = GameStateStatus.Left; //FLogger.Log(string.Format("GameState Leave: {0}", GameStateID)); try { OnLeave(); } catch (Exception e) { FLogger.LogException(e); } } } /// <summary> /// 挂起状态 /// </summary> /// <param name="cue"></param> public void Suspend() { if (status == GameStateStatus.Running || status == GameStateStatus.Entered) { status = GameStateStatus.Paused; //FLogger.Log(string.Format("GameState Suspend: {0}", GameStateID)); try { OnSuspend(); } catch (Exception e) { FLogger.LogException(e); } } } /// <summary> /// 唤醒状态 /// </summary> /// <param name="cue"></param> public void Resume() { if (status == GameStateStatus.Paused) { status = GameStateStatus.Running; //FLogger.Log(string.Format("GameState Resume: {0}", GameStateID)); try { OnResume(); } catch (Exception e) { FLogger.LogException(e); } } } /// <summary> /// 状态的心跳处理 /// </summary> /// <param name="deltaTime"></param> /// <returns></returns> public bool Update(float deltaTime) { if (status == GameStateStatus.Running || status == GameStateStatus.Entered) { status = GameStateStatus.Running; try { return OnUpdate(deltaTime); } catch (Exception e) { FLogger.LogException(e); } } return false; } /// <summary> /// 状态的渲染处理 /// </summary> /// <returns></returns> public bool Render() { try { return OnRender(); } catch (Exception e) { FLogger.LogException(e); } return false; } /// <summary> /// 处理转进 /// </summary> /// <param name="dt"></param> /// <returns></returns> public bool ProcessTransitionIn(float dt) { try { return OnProcessTransitionIn(dt); } catch (Exception e) { FLogger.LogException(e); } return false; } /// <summary> /// 处理转出 /// </summary> /// <param name="dt"></param> /// <returns></returns> public bool ProcessTransitionOut(float dt) { try { return OnProcessTransitionOut(dt); } catch (Exception e) { FLogger.LogException(e); } return false; } /// <summary> /// 渲染转进 /// </summary> /// <returns></returns> public bool RenderTransitionIn() { try { return OnRenderTransitionIn(); } catch (Exception e) { FLogger.LogException(e); } return false; } /// <summary> /// 渲染转出 /// </summary> /// <returns></returns> public bool RenderTransitionOut() { try { return OnRenderTransitionOut(); } catch (Exception e) { FLogger.LogException(e); } return false; } public void HandlerMessage(object msg) { try { OnHandlerMessage(msg); } catch (Exception e) { FLogger.LogException(e); } } #endregion #region//需要由子类重写的保护虚函数 protected virtual GameStateId OnGetStateID(){return GameStateId.None;} protected virtual void OnLoad() { } protected virtual void OnRelease() { } protected virtual bool OnCheck(IGameState state) { return true; } protected virtual void OnEnter() { } protected virtual void OnLeave() { } protected virtual void OnSuspend() { } protected virtual void OnResume() { } protected virtual void OnHandlerMessage(object msg) { } protected virtual bool OnUpdate(float deltaTime) { return true; } protected virtual bool OnRender() { return true; } protected virtual bool OnRenderTransitionIn() { return true; } protected virtual bool OnRenderTransitionOut() { return true; } protected virtual bool OnProcessTransitionIn(float dt) { return true; } protected virtual bool OnProcessTransitionOut(float dt) { return true; } #endregion } }