private void UpdateInput() { // cremos los objetos que recogerán el estado del teclado y del mando XBox (método polling) KeyboardState keystate = Keyboard.GetState(); GamePadState gamePadSate = GamePad.GetState(PlayerIndex.One); //Recogemos los inputs de la posición de la nave ////////////////// if (keystate.IsKeyDown(Keys.W) || gamePadSate.DPad.Up == ButtonState.Pressed) { playerShip.Acelerar(); } if (keystate.IsKeyDown(Keys.S) || gamePadSate.DPad.Down == ButtonState.Pressed) { playerShip.Retroceder(); } if (keystate.IsKeyDown(Keys.A) || gamePadSate.DPad.Left == ButtonState.Pressed) { playerShip.GirarIzquierda(); } else if (keystate.IsKeyDown(Keys.D) || gamePadSate.DPad.Right == ButtonState.Pressed) { playerShip.GirarDerecha(); } else { playerShip.Enderezar(); } //Inputs para los disparos /////////////////////////// if (gamePadSate.Buttons.A == ButtonState.Pressed || gamePadSate.Triggers.Right >= 0.5f || keystate.IsKeyDown(Keys.P)) { if (buttonFireDelay <= 0.0f) { FireBall shot = new FireBall(playerFireBallTexture, new Vector2(playerShip.Posicion.X, playerShip.Posicion.Y - 10.0f), 300.0f); playerFireBallList.Add(shot); laser.Play(); buttonFireDelay = 0.20f; } } }
/// <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) { float elapsed = (float)gameTime.ElapsedGameTime.TotalSeconds; //Control del delay para el canal alpha de las fuentes mFadeDelay -= gameTime.ElapsedGameTime.TotalSeconds; if (mFadeDelay <= 0) { //Reseteamos el delay del efecto mFadeDelay = .035; //Aumentamos o disminuimos el valor del tiempo del efecto mAlphaValue += mFadeIncrement; //Controlamos el máximo y el mínimo del valor para el canal alpha if (mAlphaValue >= 255 || mAlphaValue <= 0) { mFadeIncrement *= -1; } } // Allows the game to exit if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) { this.Exit(); } if (gameState == GameState.StartScreen || gameState == GameState.EndScreen) { if (!gameIntroMusic) { MediaPlayer.Play(introTheme); MediaPlayer.IsRepeating = true; gameIntroMusic = true; } UpdateSplashScreen(); } else // El juego está activo { timeIntructionText -= (float)gameTime.ElapsedGameTime.TotalSeconds; if (!gameSongStartedPlaying) { MediaPlayer.Stop(); MediaPlayer.Volume = 1.0f; MediaPlayer.Play(music); MediaPlayer.IsRepeating = true; gameSongStartedPlaying = true; } //Intervalo de tiempos para las explosiones totalTimeSpan += gameTime.ElapsedGameTime; particleSystem.Update(totalTimeSpan, gameTime.ElapsedGameTime); playerShipExplotion.Update(totalTimeSpan, gameTime.ElapsedGameTime); spaceBackground.Update(gameTime); spaceBackground2.Update(gameTime); spaceBackground3.Update(gameTime); // TODO: Add your update logic here ////////// UpdateInput(); //Actualización de los input de los controles playerShip.Update(gameTime); //aplicamos el retraso en el polling de los disparos //float elapsed = (float)gameTime.ElapsedGameTime.TotalSeconds; buttonFireDelay -= elapsed; //actualizamos la posicion de los disparos de la nave for (int i = 0; i < playerFireBallList.Count; i++) { playerFireBallList[i].Update(gameTime); if (playerFireBallList[i].Position.Y < -100.0f) //Eliminamos el objeto de la lista cuando sale de pantalla { playerFireBallList.RemoveAt(i); } } //Actualizamos la posicíon de los enemigos y de los disparos for (int i = 0; i < enemyShipList.Count; i++) { enemyShipList[i].Update(gameTime); if (enemyShipList[i].Firing) { FireBall fireball = new FireBall(enemyFireballTexture, new Vector2(enemyShipList[i].Position.X + 10.0f, enemyShipList[i].Position.Y + 30.0f), -300.0f); enemyFireballList.Add(fireball); enemyShipList[i].Firing = false; } // Colisión de los disparos del jugador con los enemigos y de las naves con el jugador if (enemyShipList.Count > 0) //De momento nos aseguramos de que haya al menos un enemigo en lista { int collide = enemyShipList[i].CollisionBall(playerFireBallList); if (collide != -1) { particleSystem.AddExplosion(enemyShipList[i].Position * new Vector2(1.0f, 1.2f)); enemyShipList.RemoveAt(i); playerFireBallList.RemoveAt(collide); points += 200; explosion.Play(); } else { if (!playerShip.RecoveringActive) //Controlamos si la nave acaba de ser destruida { if (playerShip.CollisionTest(enemyShipList[i].Position, enemyShipList[i].Radius)) { particleSystem.AddExplosion(enemyShipList[i].Position * new Vector2(1.0f, 1.1f)); playerShipExplotion.AddExplosion(playerShip.Posicion); enemyShipList.RemoveAt(i); explosion.Play(); } else if (enemyShipList[i].Position.Y > 900.0f) //eliminamos los enemigos que salen por debajo sin colisionar { enemyShipList.RemoveAt(i); } } } } } //Colisión de los disparos enemigos con el jugador for (int i = 0; i < enemyFireballList.Count; i++) { enemyFireballList[i].Update(gameTime); if (!playerShip.RecoveringActive) //Controlamos si la nave en ese momento acaba de ser destruida { if (playerShip.CollisionTest(enemyFireballList[i].Position, 20.0f)) { enemyFireballList.RemoveAt(i); //eliminamos el disparo playerShipExplotion.AddExplosion(playerShip.Posicion); explosion.Play(); } else if (enemyFireballList[i].Position.Y > 1000.0f) //eliminamos los disparos enemigos que salen por debajo sin colisionar { enemyFireballList.RemoveAt(i); } } } CreateEnemyTime(); if (playerShip.Lives < 0) { gameState = GameState.EndScreen; playerShip.Posicion = new Vector2(400.0f, 500.0f); playerShip.Lives = 5; this.points = 0; enemyFireballList.Clear(); enemyShipList.Clear(); playerFireBallList.Clear(); UpdateSplashScreen(); MediaPlayer.Stop(); gameSongStartedPlaying = false; timeIntructionText = 5.0f; } } base.Update(gameTime); }