private void InitFiniteStateMachine() { // Init all states MainMenuState mainMenu = new MainMenuState(this); mainMenu.AddTransition(StateTransition.PressStart, StateID.LevelSelect); LevelSelectState levelSelect = new LevelSelectState(this); levelSelect.AddTransition(StateTransition.ViewCard, StateID.CardView); levelSelect.AddTransition(StateTransition.ChoseLevel, StateID.GameScene); levelSelect.AddTransition(StateTransition.ViewOption, StateID.OptionView); levelSelect.AddTransition(StateTransition.ViewPay, StateID.PayView); CardViewState cardView = new CardViewState(this); cardView.AddTransition(StateTransition.BackToLevelSelect, StateID.LevelSelect); GameSceneState gameScene = new GameSceneState(this); gameScene.AddTransition(StateTransition.BackToLevelSelect, StateID.LevelSelect); OptionViewState optionView = new OptionViewState(this); optionView.AddTransition(StateTransition.BackToLevelSelect, StateID.LevelSelect); PayViewState payView = new PayViewState(this); payView.AddTransition(StateTransition.BackToLevelSelect, StateID.LevelSelect); // Init finite state machine _fsm = new FiniteStateMachine(); _fsm.AddFiniteState(mainMenu); _fsm.AddFiniteState(levelSelect); _fsm.AddFiniteState(cardView); _fsm.AddFiniteState(gameScene); _fsm.AddFiniteState(optionView); _fsm.AddFiniteState(payView); }
/// <summary> /// Select next level to the right /// </summary> private void SelectRight() { // cant select anything to the right if (m_currentIndex >= m_levels.Count - 1) return; m_currentIndex++; m_currentPosition = new Vector2(1, 0); m_levelSourcePosition = new Vector2(1, 0); m_levelTargetPosition = new Vector2(0, 0); m_state = LevelSelectState.LEVEL_SELECT_STATE_ANIMATING; }
/// <summary> /// Select next level to the left /// </summary> private void SelectLeft() { // cant select anything to the left.. if (m_currentIndex == 0) return; m_currentIndex--; m_currentPosition = new Vector2(-1, 0); m_levelSourcePosition = new Vector2(-1, 0); m_levelTargetPosition = new Vector2(0, 0); m_state = LevelSelectState.LEVEL_SELECT_STATE_ANIMATING; }
/// <summary> /// Update model /// </summary> /// <param name="time">Delta time</param> public void Update(GameTime time) { float elapsedTime = (float)time.ElapsedGameTime.TotalSeconds; // // Calculate transition interpolation when level // selection animation is running. if (m_state == LevelSelectState.LEVEL_SELECT_STATE_ANIMATING) { // Update transition timer m_levelTransitionTimer += elapsedTime; // Check if the transition is complete // Then just set positions to target, and change ingame state to none if (m_levelTransitionTimer >= LEVEL_TRANSITION_TIME) { m_levelTransitionTimer = 0; m_currentPosition = m_levelTargetPosition; m_state = LevelSelectState.LEVEL_SELECT_STATE_NONE; } else { // Calculate offset in transition. m_currentPosition = m_levelSourcePosition + ((m_levelTargetPosition - m_levelSourcePosition) * (m_levelTransitionTimer / LEVEL_TRANSITION_TIME)); } } }