/// <summary> /// Allows the game to run logic such as updating the world, /// checking for collisions, gathering input, and playing audio. /// </summary> /// <param name="gameTime">Provides a snapshot of timing values.</param> protected override void Update(GameTime gameTime) { // Allows the game to exit if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) { this.Exit(); } // TODO: Add your update logic here previousKbState = kbState; kbState = Keyboard.GetState(); // Esc to close game if (kbState.IsKeyDown(Keys.Escape)) { this.Exit(); } dt = (float)gameTime.ElapsedGameTime.TotalSeconds; switch (state) { case State.MENU: score = 0; topText = "Enter to begin. A to autoplay"; autoplay = false; if (GetSongFilePath("song.txt")[0] != songFile[0]) { audioAnalysis.DisposeAudioAnalysis(); songFile = GetSongFilePath("song.txt"); AnalyseSong(songFile[0]); } PlaceBeats(); if (kbState.IsKeyDown(Keys.Enter)) { state = State.START_GAME; } else if (kbState.IsKeyDown(Keys.A)) { autoplay = true; state = State.START_GAME; } break; case State.START_GAME: audioAnalysis.PlayAudio(); topText = ""; state = State.PLAYING; break; case State.PLAYING: // If the Quit button is pressed, end game if (kbState.IsKeyDown(Keys.R)) { state = State.END; } // If the playback has reached the end of the audio track, end game if (audioAnalysis.PCMStream.Position >= audioAnalysis.PCMStream.Length) { state = State.END; } // Check if the Hit button is pressed drumDown = false; if (kbState.IsKeyDown(Keys.Left) || kbState.IsKeyDown(Keys.Right) || autoplay) { drumDown = true; } for (int i = 0; i < gameObjects.Count; i++) { gameObjects[i].update(dt); } for (int i = 0; i < notes.Count; i++) { notes[i].update(dt); /* * // Remove notes that go off screen * if (notes[i].Position.X + notes[i].Origin.X < 0) * { * notes[i].Active = false; * } * else if (notes[i].Position.Y + notes[i].Origin.Y < 0) * { * notes[i].Active = false; * } * else if (notes[i].Alpha <= 0) * { * notes[i].Active = false; * }*/ // Check for hit collision if (drumDown) { float notePos = notes[i].Position.X; // If note is on top of the marker if (Math.Abs(markerPosX - notePos) <= noteSize && marker.Position.Y == notes[i].Position.Y) { // Increase the score score += 100; // Play a hit and fade away animation notes[i].AlphaVelocity = -5.0f; notes[i].Velocity = new Vector2(0, -1000); notes[i].TintColor = Color.GhostWhite; } } } break; case State.END: audioAnalysis.StopAudio(); topText = "Game Over. R to restart"; if (previousKbState.IsKeyUp(Keys.R) && kbState.IsKeyDown(Keys.R)) { state = State.MENU; } break; } base.Update(gameTime); }