public void ChangeState(gxGameState pState, bool destroyPrevious = true) { Common.UDebug.Assert(m_stateIndex >= 0); m_pStateStack[m_stateIndex].Release(); if (destroyPrevious) { m_pStateStack[m_stateIndex] = null; } m_stateIndex--; if (pState == null) { Common.UDebug.Assert(false, "Tried to add a NULL state !!"); ClearStateStack(); } Common.UDebug.Assert(m_stateIndex < GAME_STATES_STACK_SIZE); m_stateIndex++; m_pStateStack[m_stateIndex] = pState; int result = pState.Initalize(); if (result < 0) { Common.UDebug.Log(" state create failed with " + result); Common.UDebug.Assert(false, "Failed to create the current state!!!!"); ClearStateStack(); } else { pState.Resume(); } }
//等这一帧运行完,在进行调用 protected void LateChangeState(GameStateEnum eGameStateEnum) { if (m_curGameStateEnum == eGameStateEnum) { return; } if (m_gameState != null) { m_gameState.Exit(); m_gameState.Deinitialization(); m_gameState = null; } switch (eGameStateEnum) { case GameStateEnum.GameStateEnum_Login: case GameStateEnum.GameStateEnum_Resert: m_gameState = new GameLoginState(); break; } m_gameState.Initalize(); if (eGameStateEnum == GameStateEnum.GameStateEnum_Resert) { eGameStateEnum = GameStateEnum.GameStateEnum_Login; } m_curGameStateEnum = eGameStateEnum; }
void ClearStateStack() { while (m_stateIndex >= 0) { m_pStateStack[m_stateIndex].Pause(); m_pStateStack[m_stateIndex].Release(); m_pStateStack[m_stateIndex] = null; m_stateIndex--; } ResetTouch(); while (m_pStatePushed.Count > 0) { m_pStatePushed.Pop(); } m_pStatePoped = null; }
public void Update(float timestamp) { if (m_pStatePoped != null) { m_pStatePoped.Pause(); m_pStatePoped.Release(); m_stateIndex--; if (m_stateIndex >= 0) { m_pStateStack[m_stateIndex].Resume(); } ResetTouch(); m_pStatePoped = null; } if (m_pStatePushed.Count > 0) { gxGameState pState = m_pStatePushed.Pop(); if (pState == null) { Common.UDebug.Assert(false, "Tried to add a NULL state !!!"); ClearStateStack(); } Common.UDebug.Assert(m_stateIndex < GAME_STATES_STACK_SIZE); gxGameState oldState = CurrentState(); if (oldState != null) { oldState.Pause(); } m_stateIndex++; m_pStateStack[m_stateIndex] = pState; if (pState.Initalize() < 0) { Common.UDebug.Assert(false, "Failed to create the current state!!!!"); ClearStateStack(); } else { pState.Resume(); pState.SetLoading(true); } ResetTouch(); } if (m_stateIndex < 0) { return; } if (m_pStateStack[m_stateIndex].IsLoading()) { m_pStateStack[m_stateIndex].SetLoading(m_pStateStack[m_stateIndex].Load()); } else { m_pStateStack[m_stateIndex].Update(timestamp); } }
public override void Initalize() { m_stateIndex = -1; m_pStatePoped = null; }
public void PopState(bool bResume) { Common.UDebug.Assert(m_stateIndex >= 0); m_pStatePoped = m_pStateStack[m_stateIndex]; m_pStateStack [m_stateIndex] = null; //解除引用 }
public void PushState(gxGameState pState) { m_pStatePushed.Add(pState); }