/// <summary> /// Update all the game component /// </summary> /// <param name="gameTime"></param> /// <param name="otherScreenHasFocus"></param> /// <param name="coveredByOtherScreen"></param> public override void Update(GameTime gameTime, bool otherScreenHasFocus, bool coveredByOtherScreen) { // Do not advance to the highscore screen if sounds are playing if (moveToHighScore && !AudioManager.AreSoundsPlaying()) { ScreenManager.Game.Components.Remove(currentLevel); foreach (GameScreen screen in ScreenManager.GetScreens()) { screen.ExitScreen(); } ScreenManager.AddScreen(new BackgroundScreen(true), null); ScreenManager.AddScreen(new HighScoreScreen(), null); } // Do not perform advance update logic if the game is inactive or we are // moving to the highscore screen if (!IsActive || moveToHighScore) { base.Update(gameTime, otherScreenHasFocus, coveredByOtherScreen); return; } if ((inputState == TouchInputState.GracePeriod) && (isActive)) { inputTimeMeasure += gameTime.ElapsedGameTime; // if the input grace period is over, handle the touch input if (inputTimeMeasure >= inputGracePeriod) { currentLevel.RegisterTouch(lastPressInput); inputState = TouchInputState.Idle; } } // If the user passed the level, advance to the next or finish the game if // the current level was last if (currentLevel.CurrentState == LevelState.FinishedOk && isActive) { AudioManager.PlaySound("success"); if (currentLevelNumber < maxLevelNumber) { currentLevelNumber++; isLevelChange = true; } else { FinishCurrentGame(); } } // If the user failed to pass the level, revert to level one, allowing the // user to register a highscore if he reached a high enough level else if (currentLevel.CurrentState == LevelState.FinishedFail) { isActive = false; if (HighScoreScreen.IsInHighscores(currentLevelNumber)) { // The player has a highscore - show the device's keyboard Guide.BeginShowKeyboardInput(PlayerIndex.One, Constants.HighscorePopupTitle, Constants.HighscorePopupText, Constants.HighscorePopupDefault, ShowHighscorePromptEnded, false); } else { AudioManager.PlaySound("fail"); isActive = true; currentLevelNumber = 1; isLevelChange = true; } } if (isLevelChange) { ScreenManager.Game.Components.Remove(currentLevel); currentLevel = new Level(ScreenManager.Game, ScreenManager.SpriteBatch, currentLevelNumber, buttonsTexture); currentLevel.IsActive = true; ScreenManager.Game.Components.Add(currentLevel); isLevelChange = false; } base.Update(gameTime, otherScreenHasFocus, coveredByOtherScreen); }
/// <summary> /// Handle user presses. /// </summary> /// <param name="touchPoints">The locations touched by the user. The list /// is expected to contain at least one member.</param> public void RegisterTouch(List <TouchLocation> touchPoints) { if ((CurrentState == LevelState.Started || CurrentState == LevelState.InProcess)) { ButtonColors[] stepColors = sequence.First.Value; bool validTouchRegistered = false; if (touchPoints.Count > 0) { // Reset current touch sample for (int i = 0; i < Settings.ButtonAmount; i++) { currentTouchSampleColors[i] = null; } // Go over the touch points and populate the current touch sample for (int i = 0; i < touchPoints.Count; i++) { var gestureBox = new BoundingBox( new Vector3(touchPoints[i].Position.X - 5, touchPoints[i].Position.Y - 5, 0), new Vector3(touchPoints[i].Position.X + 10, touchPoints[i].Position.Y + 10, 0)); if (redShpere.Intersects(gestureBox)) { currentTouchSampleColors[i] = ButtonColors.Red; AudioManager.PlaySound("red"); } else if (yellowShpere.Intersects(gestureBox)) { currentTouchSampleColors[i] = ButtonColors.Yellow; AudioManager.PlaySound("yellow"); } else if (blueShpere.Intersects(gestureBox)) { currentTouchSampleColors[i] = ButtonColors.Blue; AudioManager.PlaySound("blue"); } else if (greenShpere.Intersects(gestureBox)) { currentTouchSampleColors[i] = ButtonColors.Green; AudioManager.PlaySound("green"); } CurrentState = LevelState.InProcess; } List <ButtonColors> colorsHit = new List <ButtonColors>(currentTouchSampleColors.Length); // Check if the user pressed at least one of the colored buttons foreach (var hitColor in currentTouchSampleColors) { if (hitColor.HasValue) { validTouchRegistered = true; colorsHit.Add(hitColor.Value); } } // Find the buttons which the user failed to touch List <ButtonColors> missedColors = new List <ButtonColors>(stepColors.Length); foreach (var stepColor in stepColors) { if (!colorsHit.Contains(stepColor)) { missedColors.Add(stepColor); } } // If the user failed to perform the current move, fail the level // Do nothing if no buttons were touched if (((missedColors.Count > 0) || (touchPoints.Count != stepColors.Length)) && validTouchRegistered) { CurrentState = LevelState.Fault; } if (validTouchRegistered) { // Show user pressed buttons, reset timeout period // for button flash drawUserInput = true; inputFlashPeriod = TimeSpan.Zero; MovesPerformed++; sequence.Remove(stepColors); if ((sequence.Count == 0) && (CurrentState != LevelState.Fault)) { CurrentState = LevelState.Success; } } } } }