/// <summary> /// Fonction membre abstraite mettant à jour le sprite selon les touches de clavier pressées. /// La rotation est effectuée modulo 360 degrés. /// </summary> /// <param name="gameTime">Indique le temps écoulé depuis la dernière invocation.</param> /// <param name="graphics">Gestionnaire de périphérique d'affichage.</param> public override void Update(GameTime gameTime, GraphicsDeviceManager graphics) { // Décaler l'ennemi vers la gauche. this.Position = new Vector2(Position.X - (gameTime.ElapsedGameTime.Milliseconds * this.VitesseDeplacement), Position.Y); this.angleRotation += gameTime.ElapsedGameTime.Milliseconds * this.vitesseRotation; this.angleRotation %= MathHelper.Pi * 2; float timer = (float)gameTime.ElapsedGameTime.TotalSeconds; remainingDelay -= timer; Vector2 projectilePos = new Vector2(this.Position.X, this.Position.Y); if (remainingDelay <= 0) { remainingDelay = delay; Obus obus = new Obus(projectilePos, ProjectileType.smallFireShot, angle: this.angleRotation + MathHelper.ToRadians(35f), isEnnemi: true); obus.Source = this; this.ShootObus(obus); obus = new Obus(projectilePos, ProjectileType.smallFireShot, angle: this.angleRotation - MathHelper.ToRadians(75f), isEnnemi: true); obus.Source = this; this.ShootObus(obus); obus = new Obus(projectilePos, ProjectileType.smallFireShot, angle: this.angleRotation + (float)Math.PI - MathHelper.ToRadians(35f), isEnnemi: true); obus.Source = this; this.ShootObus(obus); } }
/// <summary> /// Déléguée pour tirer (les vaisseaux) /// </summary> /// <param name="obus">Obus en question</param> /// <param name="isPlayer">Est-ce-que l'obus vient du joueur</param> private void Shoot(Obus obus, bool isPlayer) { if (isPlayer) { listeObusJoueur.Add(obus); } else { listeObusEnnemis.Add(obus); } }
/// <summary> /// On charge nos variables /// </summary> public void LoadContent() { this.menuManager.LoadContent(); this.menuManager.MenuCourant = this.menuManager.TrouverMenu("MainMenu"); // Créer un nouveau SpriteBatch, utilisée pour dessiner les textures. this.spriteBatch = new SpriteBatch(this.graphics.GraphicsDevice); // Charger les sprites. JoueurSprite.LoadContent(this.GetContent(), this.graphics); ArrierePlanEspace.LoadContent(this.GetContent(), this.graphics); Obus.LoadContent(this.GetContent(), this.graphics); EnnemiShip.LoadContent(this.GetContent(), this.graphics); EnnemiSpinner.LoadContent(this.GetContent(), this.graphics); PowerUp_Fire_Shot.LoadContent(this.GetContent(), this.graphics); PowerUp_Energy_Ball.LoadContent(this.GetContent(), this.graphics); PowerUp_One_Projectile.LoadContent(this.GetContent(), this.graphics); PowerUp_Three_Projectile.LoadContent(this.GetContent(), this.graphics); PowerUp_Two_Projectile.LoadContent(this.GetContent(), this.graphics); this.policePetit = this.GetContent().Load <SpriteFont>(@"Pipeline/Polices/PoliceItem"); this.policeGrand = this.GetContent().Load <SpriteFont>(@"Pipeline/Polices/PoliceTitre"); // Créer les sprites du jeu. Premièrement le sprite du joueur centrer au bas de l'écran. On limite ensuite // ses déplacements à l'écran. this.vaisseauJoueur = new JoueurSprite(this.graphics.GraphicsDevice.Viewport.Width / 8f, this.graphics.GraphicsDevice.Viewport.Height / 2f); this.vaisseauJoueur.BoundsRect = new Rectangle(0, 0, this.graphics.GraphicsDevice.Viewport.Width, this.graphics.GraphicsDevice.Viewport.Height); this.vaisseauJoueur.ShootObus += Shoot; this.vaisseauJoueur.NbVies = 3; this.bruitageRamasser = this.GetContent().Load <SoundEffect>(@"Pipeline\SoundFX\pickup"); // Créer ensuite les sprites représentant les arrière-plans. this.arrierePlanEspace = new ArrierePlanEspace(this.graphics); // Charger le bruitage de fond du jeu. this.bruitageFond = this.GetContent().Load <Song>(@"Pipeline\Songs\scifi072"); this.mainmenuImage = this.GetContent().Load <Texture2D>(@"ArrieresPlans\mainmenu.jpg"); // Charger les textures associées aux effets visuels gérées par Game. this.particulesExplosions = this.GetContent().Load <Texture2D>(@"Explosion\explosionAsteroides"); bruitageExplosion = this.GetContent().Load <SoundEffect>(@"Pipeline\SoundFX\explosion001"); // Paramétrer la musique de fond et la démarrer. MediaPlayer.Volume = 0.05f; // pour mieux entendre les autres effets sonores MediaPlayer.IsRepeating = true; MediaPlayer.Play(bruitageFond); MediaPlayer.Pause(); }
/// <summary> /// Fonction membre abstraite mettant à jour le sprite selon les touches de clavier pressées. /// La rotation est effectuée modulo 360 degrés. /// </summary> /// <param name="gameTime">Indique le temps écoulé depuis la dernière invocation.</param> /// <param name="graphics">Gestionnaire de périphérique d'affichage.</param> public override void Update(GameTime gameTime, GraphicsDeviceManager graphics) { // Décaler l'ennemi vers la gauche. this.Position = new Vector2(Position.X - (gameTime.ElapsedGameTime.Milliseconds * this.VitesseDeplacement), Position.Y); float timer = (float)gameTime.ElapsedGameTime.TotalSeconds; remainingDelay -= timer; Vector2 projectilePos = new Vector2(this.Position.X - (this.Width / 2), this.Position.Y); if (remainingDelay <= 0) { remainingDelay = delay; Obus obus = new Obus(projectilePos, ProjectileType.blueEnergyBall, angle: GetAngleToPlayer(this), isEnnemi: true); obus.Source = this; this.ShootObus(obus); } }
/// <summary> /// Fonction membre abstraite mettant à jour le sprite selon les touches de clavier pressées. /// Les déplacement tiennent compte de l'accélération (au début du mouvement) et de l'inertie (à /// la fin du mouvement). /// </summary> /// <param name="gameTime">Gestionnaire de temps de jeu.</param> /// <param name="graphics">Gestionnaire de périphérique d'affichage.</param> public override void Update(GameTime gameTime, GraphicsDeviceManager graphics) { const float FacteurAcceleration = 0.02f; // facteur d'accélération et de décélération const float VitesseMaximale = 0.4f; // vitesse latérale et frontale maximale this.projectileAngle = 0f; float delayTimer = (float)gameTime.ElapsedGameTime.TotalSeconds; if (IsRespawned) { if (this.Health != this.maxHealth) { this.Health = this.maxHealth; } _remainingBlinkDelay -= delayTimer; if (_remainingBlinkDelay <= 0) { _remainingBlinkDelay = _blinkDelay; if (this.vaisseau == GameManager.invisiblePixel) { this.vaisseau = previousTexture; } else { previousTexture = this.vaisseau; this.vaisseau = GameManager.invisiblePixel; } } _remainingInvulnDelay -= delayTimer; if (_remainingInvulnDelay <= 0) { _remainingInvulnDelay = _invulnDelay; IsRespawned = false; } } // Changer le vaisseau affiché et ajuster sa position horizontale selon la touche pressée // (en tenant compte de l'accélération / décélération) float facteurInputs = ServiceHelper.Get <IInputService>().DeplacementDroite(this.IndexPeripherique) - ServiceHelper.Get <IInputService>().DeplacementGauche(this.IndexPeripherique); if (facteurInputs < 0.0f) { this.vitesseLaterale = Math.Max(this.vitesseLaterale - FacteurAcceleration, -VitesseMaximale); } else if (facteurInputs > 0.0f) { this.vitesseLaterale = Math.Min(this.vitesseLaterale + FacteurAcceleration, VitesseMaximale); } else { if (!IsRespawned) { this.vaisseau = vaisseauAvant; } else { this.previousTexture = vaisseauAvant; } // Décélération latérale au besoin if (Math.Abs(this.vitesseLaterale) >= FacteurAcceleration) { this.vitesseLaterale -= Math.Sign(this.vitesseLaterale) * FacteurAcceleration; } else { this.vitesseLaterale = 0.0f; } } // Changer la position verticale selon la touche pressée (en tenant compte de l'accélération / décélération) facteurInputs = ServiceHelper.Get <IInputService>().DeplacementAvant(this.IndexPeripherique) - ServiceHelper.Get <IInputService>().DeplacementArriere(this.IndexPeripherique); if (facteurInputs > 0.0f) { if (this.vitesseLaterale >= 0.0f) { if (!IsRespawned) { this.vaisseau = vaisseauGauche; } else { this.previousTexture = vaisseauGauche; } this.projectileAngle = -MathHelper.ToRadians(35f); } else { if (!IsRespawned) { this.vaisseau = vaisseauDroite; } else { this.previousTexture = vaisseauDroite; } this.projectileAngle = MathHelper.ToRadians(35f); } this.vitesseFrontale = Math.Max(this.vitesseFrontale - FacteurAcceleration, -VitesseMaximale); } else if (facteurInputs < 0.0f) { if (this.vitesseLaterale >= 0.0f) { if (!IsRespawned) { this.vaisseau = vaisseauDroite; } else { this.previousTexture = vaisseauDroite; } this.projectileAngle = MathHelper.ToRadians(35f); } else { if (!IsRespawned) { this.vaisseau = vaisseauGauche; } else { this.previousTexture = vaisseauGauche; } this.projectileAngle = -MathHelper.ToRadians(35f); } this.vitesseFrontale = Math.Min(this.vitesseFrontale + FacteurAcceleration, VitesseMaximale); } else { if (!IsRespawned) { this.vaisseau = vaisseauAvant; } else { this.previousTexture = vaisseauAvant; } // Décélération frontale au besoin if (Math.Abs(this.vitesseFrontale) >= FacteurAcceleration) { this.vitesseFrontale -= Math.Sign(this.vitesseFrontale) * FacteurAcceleration; } else { this.vitesseFrontale = 0.0f; } } // Activer les effets sonores associés aux moteurs lorsque ceux-ci sont actifs. if (this.vitesseFrontale != 0.0f || this.vitesseLaterale != 0.0f) { if (this.moteursActif.State != SoundState.Playing) { this.moteursActif.Play(); } } else { if (this.moteursActif.State != SoundState.Paused) { this.moteursActif.Pause(); } } // Si l'effet sonore associé aux moteurs est actif, ajuster le volume // en fonction de la vitesse de réplacement (le volume est ainsi // relatif aux accélérations et décélérations). if (this.moteursActif.State == SoundState.Playing) { this.moteursActif.Volume = Math.Max(Math.Abs(this.vitesseFrontale), Math.Abs(this.vitesseLaterale)) / VitesseMaximale; } int changeProjectileCount = ServiceHelper.Get <IInputService>().SetProjectileCount(this.IndexPeripherique); if (changeProjectileCount != 0) { this.projectileCount = changeProjectileCount; } bool changeProjectile = ServiceHelper.Get <IInputService>().SetProjectile(this.IndexPeripherique); if (changeProjectile) { this.projectileType = (ProjectileType)(((int)this.projectileType + 1) % ((int)ProjectileType.blueEnergyBall + 1)); } if (!this.IsRespawned && ServiceHelper.Get <IInputService>().Shoot(this.IndexPeripherique, this.projectileType)) { Vector2 pos; if (projectileCount == 1 || projectileCount == 3) { pos = new Vector2(this.Position.X + (this.Width / 2), this.Position.Y); } else { pos = new Vector2(this.Position.X, this.Position.Y + this.Height / 2); } bulletShoot.Play(0.025f, 0f, 0f); Obus obus = new Obus(pos, this.projectileType, this.projectileAngle); obus.Source = this; this.shootObus(obus); if (projectileCount == 2) { pos = new Vector2(this.Position.X, this.Position.Y - this.Height / 2); obus = new Obus(pos, this.projectileType, this.projectileAngle); obus.Source = this; this.shootObus(obus); } else if (projectileCount == 3) { pos = new Vector2(this.Position.X, this.Position.Y + this.Height / 2); obus = new Obus(pos, this.projectileType, MathHelper.ToRadians(35f) + projectileAngle); obus.Source = this; this.shootObus(obus); pos = new Vector2(this.Position.X, this.Position.Y - this.Height / 2); obus = new Obus(pos, this.projectileType, -MathHelper.ToRadians(35f) + projectileAngle); obus.Source = this; this.shootObus(obus); } } // Déplacer le vaisseau en fonction des vitesses latérales et frontales this.Position = new Vector2( this.Position.X + (gameTime.ElapsedGameTime.Milliseconds * this.vitesseLaterale), this.Position.Y + (gameTime.ElapsedGameTime.Milliseconds * this.vitesseFrontale)); }