Space shooter : Aron & The Aliens

Chapitre 16 : L'invasion de la galaxie - les Ovnis

 

Tutoriel présenté par : Robert Gillard (Gondulzak)
Publication : 3 août 2014
Dernière mise à jour : 22 novembre 2015

 

      Préliminaires

   Dans notre précédent chapitre nous avons introduit les sorcières aliens que nous avons fait défiler de la gauche vers la droite de notre écran de jeu. wink

   Mais celles-ci ne sont que les précurseurs d'une plus grande menace encore !... devil

   Effectivement, maintenant nous voyons des vagues d'ovnis, provenant d'une même lointaine galaxie que les sorcières, apparaître périodiquement et envahir toute la nôtre ! cheeky

   Ces nouveaux ennemis défilent en arrière plan des aliens et comme nous allons avoir besoin d'une nouvelle classe pour leur gestion, nous appellerons simplement celle-ci «FarEnemy».

 

Le projet « AronAndTheAliens06 »

 

   Reprenez votre projet précédent ou créez-en un nouveau que vous nommerez «AronAndTheAliens06» (reportez-vous au chapitre précédent en ce qui concerne les manipulations à réaliser).

 

 

     1 – Classe FarEnemy : Le code

   Ok, vous pouvez maintenant créer une nouvelle classe, la classe «FarEnemy». Remplacez le code existant par le code suivant :

 

#region Description
//MERUVIA XNA TUTORIALS
//AronAnTheAliens06
//Jeu : Aron and the aliens
//Invasion de la Galaxie
//Fichier : FarEnemy.cs
//Last update : 01/08/2014
#endregion
 
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
 
namespace AronAndTheAliens06
{
class FarEnemy
{
#region Déclaration des variables de la classe FarEnemy
 
// Un effet sur le sprite ennemi lointain
public SpriteEffects SpriteEffet;
 
// L'animation qui représente l'ennemi lointain
public Animation FarEnemyAnimation;
 
// La position de l'ennemi lointain relative au coin
//supérieur gauche de l'écran
public Vector2 Position;
 
// Points de santé d'un ennemi lointain
public int Health;
 
// Etat d'un ennemi lointain
public bool Active;
 
// Vitesse de déplacement d'un ennemi lointain
float farEnemyMoveSpeed;
 
#endregion Déclaration des variables de la classe FarEnemy
 
 
#region Propriétés
 
// Renvoie la largeur du sprite ennemi lointain
public int frameWidth
{
get { return FarEnemyAnimation.FrameWidth; }
}
 
// Renvoie la hauteur du sprite ennemi lointain
public int frameHeight
{
get { return FarEnemyAnimation.FrameHeight; }
}
 
#endregion Propriétés
 
 
#region Fonction d'initialisation
 
public void Initialize(Animation animation, Vector2 position)
{
 
// Charge la texture des ennemis lointains
FarEnemyAnimation = animation;
 
 
// Les points de santé d'un ovni sont de 75
Health = 75;
 
// Initialise la position d'un ennemi lointain
this.Position = position;
 
//On dirige les ennemis lointains dans la direction des frames de
//la feuille de sprites
SpriteEffet = SpriteEffects.None;
 
// Le "drapeau" Active est mis à true pour permettre aux ovnis
// de de se présenter eu début du jeu
Active = true;
 
// Vitesse d'un ennemi lointain
farEnemyMoveSpeed = 0.6f;
 
}
 
#endregion Fonction d'initialisation
 
 
#region Fonction de mise à jour
 
public void Update(GameTime gameTime)
{
// Un ovni se dirige toujours de la gauche vers la droite
Position.X += farEnemyMoveSpeed;
 
// Lise à jour de la position de l'animation
FarEnemyAnimation.Position = Position;
FarEnemyAnimation.spriteEffet = SpriteEffet;
 
// Mise à jour de l'animation
FarEnemyAnimation.Update(gameTime);
 
// Si l'ovni sort de l'écran par la droite ou si ses points de
// santé sont <= 0, on le désactive
if ((Position.X > 800 + frameWidth) || Health <= 0)
{
// En mettant le "drapeau" Active à false, l'objet ovni est
// enlevé de la liste
Active = false;
}
}
 
#endregion Fonction de mise à jour
 
 
#region Fonction de dessin
 
public void Draw(SpriteBatch spriteBatch)
{
// Dessine l'animation
FarEnemyAnimation.Draw(spriteBatch);
}
 
#endregion Fonction de dessin
}
}
 

 

   Ce code peut se passer de commentaires. En effet, les commentaires écrits dans le précédent tutoriel concernant la classe «Enemy» sont tout-à-fait identiques, seul l'objet sur lequel portent ces commentaires est différent. Je dirai simplement que dans ce chapitre, les termes «Ennemi lointain» et «Ovni» se rapportent évidemment au même objet.

   Vous remarquerez également que les points de santé et la vitesse d'un ovni sont différents des mêmes paramètres initialisés pour les aliens du chapitre précédent. Vous vous apercevrez lors de la compilation de ce projet que ces différences respectent le réalisme de la «scène de jeu» ainsi que son aspect de profondeur.  wink

   C'est tout ce qu'il y a à dire sur la classe «FarEnemy», nous pouvons maintenant compléter le code de notre fichier AronAndTheAliens06.cs. :)

 

   2 – Fichier «AronAndTheAliens06.cs»


   On retourne donc maintenant dans notre fichier AronAndTheAliens06.cs. Avant toute chose, n'oubliez pas de mettre le fichier Ovni.png dans le dossier Textures de votre projet, si ce n'est pas déjà fait ! smiley

   Ici, nous n'allons pas créer de région Far enemies declarations data's. Il vous sera plus facile de supprimer complètement la région ENEMIES DECLARATIONS DATA'S et de la remplacer par celle-ci :

 

#region ENEMIES DECLARATIONS DATA'S
 
Texture2D enemyTexture; //Texture feuille de sprites sorcières
Texture2D ovniTexture; //Texture feuille de sprites ovnis
 
// Un générateur de nombres aléatoires
Random random = new Random();
List<Enemy> enemies; //Gestion des ennemis dans une liste
List<FarEnemy> farEnemies; //Gestion des ennemis lointains
 
// La fréquence à laquelle apparait un ennemi
TimeSpan enemySpawnTime;
TimeSpan previousEnemySpawnTime;
 
// La fréquence à laquelle apparait un ennemi lointain
TimeSpan farEnemySpawnTime;
TimeSpan previousFarEnemySpawnTime;
 
#endregion ENEMIES DECLATATIONS DATA'S

 

   Région dans laquelle nous ajoutons les déclarations des nouvelles variables concernant les ennemis lointains. Rien de spécial donc mais j'espère que vous comprenez bien l'importance des régions maintenant, avec tous ces codes qui s'ajoutent, vous allez y gagner énormément en lisibilité. wink


   Fonction Initalize()

  Nous devons compléter cette fonction. A l'intérieur de la région INITIALIZE ANIMATIONS DATA'S, ajoutez :

 
En -dessous de :
enemies = new List<Enemy>();
Ajoutez :
//Instanciation de la liste FarEnemy
farEnemies = new List<FarEnemy>();

 

En -dessous de :
previousEnemySpawnTime = TimeSpan.Zero;
Ajoutez :
previousFarEnemySpawnTime = TimeSpan.Zero;
 
En -dessous de :
enemySpawnTime = TimeSpan.FromSeconds(3.5f);
Ajoutez :
//Détermine à quelle fréquence un ennemi lointain réapparaît
farEnemySpawnTime = TimeSpan.FromSeconds(2.5f);

 

   Pour terminer, nous donnons une valeur égale à 2.5 secondes à la variable farEnemySpawnTime, ce qui représente la fréquence d'apparition des ovnis à l'écran. wink

   Et c'est tout en ce qui concerne la fonction Initialize().

 

   Fonction LoadContent()

   Dans la fonction LoadContent(), dans la région des textures, ajoutez :

 
En -dessous de :
 
enemyTexture = Content.Load<Texture2D>("Textures/sorceres2");
Ajoutez :
ovniTexture = Content.Load<Texture2D>("Textures/Ovni");

 

   Et c'est tout en ce qui concerne la fonction LoadContent().
   Nous allons maintenant écrire la fonction AddFarEnemy(), qui ajoute un ovni à la liste des ovnis et que nous allons placer à la suite de la mise à jour de la liste des Ennemis. Donc, à la suite de la région ENEMIES UPDATE LIST FUNCTION, vous entrerez la région suivante : 

 
#region ADD FARENEMY TO LIST
 
//Ajoute un ennemi lointain à la liste
private void AddFarEnemy()
{
int farEnemyType;
float farEnemyRatio = 0.0f;
 
farEnemyType = rand.Next(1, 3);
 
switch (farEnemyType)
{
case 1:
farEnemyRatio = 0.6f;
break;
 
case 2:
farEnemyRatio = 0.8f;
break;
 
default:
break;
}
 
// Création d'un ovni animé
Animation farEnemyAnimation = new Animation();
 
// On initialise l'animation par rapport aux données de la feuille de
//sprites et le temps que nous désirons appliquer entre chaque frame
farEnemyAnimation.Initialize(ovniTexture,
Vector2.Zero,
50,
30,
2,
200,
Color.White,
farEnemyRatio,
true);
 
Vector2 position = new Vector2(0, random.Next(0 +
farEnemyAnimation.FrameHeight / 2,
GraphicsDevice.Viewport.Height -
farEnemyAnimation.FrameHeight / 2));
 
//Crétation d'un ovni
FarEnemy farEnemy = new FarEnemy();
 
// Initialisation d'un ovni par rapport à sa position
farEnemy.Initialize(farEnemyAnimation, position);
 
// Ajout de l'ovni à sa liste active
farEnemies.Add(farEnemy);
 
}
 
#endregion ADD FARENEMY TO LIST

 

   Les explications nécessaires à apporter à la fonction AddFarEnemy() sont identiques à celles déjà vues dans la fonction AddEnemy() du chapitre 14.

   Je dois simplement ajouter ici que désirant afficher des ovnis avec deux aires différentes par rapport à leur sprite d'origine, j'initialise une variable entière, farEnemyType qui va me permettre de choisir aléatoirement l'un des deux ratios (60% ou 80%) et qui sera l'aire que je désire destiner à un ovni, ratio que je passe à la variable farEnemyRatio.

   Et à la fin de cette fonction, nous ajoutons l'ovni à la liste des ovnis à l'aide de l'instruction :

farEnemies.Add(farEnemy);


   Nous devons maintenant mettre à jour la liste des ovnis à l'aide de la fonction UpdateFarEnemies(), donc à la suite de la fonction AddFarEnemy(), entrez la région suivante :  

 
#region FAR ENEMIES UPDATE LIST FUNCTION
 
private void UpdateFarEnemies(GameTime gameTime)
{
if ((planets.JupiterPosition.X > 700) && (planets.JupiterPosition.X > -300))
{
// Génération d'un nouvel ovni
if (gameTime.TotalGameTime - previousFarEnemySpawnTime > farEnemySpawnTime)
{
previousFarEnemySpawnTime = gameTime.TotalGameTime;
 
// Ajoute un ovni
AddFarEnemy();
}
}
 
// Mise à jour de la liste des ovnis
for (int i = farEnemies.Count - 1; i >= 0; i--)
{
farEnemies[i].Update(gameTime);
 
// Si l'état est inactif
if (farEnemies[i].Active == false)
farEnemies.RemoveAt(i);
}
}
 
#endregion FAR ENEMIES UPDATE LIST FUNCTION

 

   Cette fonction va dans un premier temps générer un nouvel ovni toutes les 2.5 secondes et l'ajouter à la liste des ovnis par l'appel à la fonction AddFarEnemy() que nous venons de voir plus haut. :)

   Nous parcourons ensuite toute la liste des ovnis afin de permettre leur mise à jour et voir si leur état est toujours actif. Si le booléen Active est false pour un objet d'un indice i quelconque de la liste, celui-ci est immédiatement enlevé de cette liste à l'aide de l'instruction farEnemies.RemoveAt(i);


   Remarque :

   Vous observerez qu'au début de cette fonction, je fais un test sur la position de la planète Jupiter ! surprise

   Pourquoi faire cela ici, me demanderez-vous ? indecision

   La réponse est simple. :) Ne désirant pas surcharger la fenêtre de combat en début de jeu et afin de permettre au joueur de prendre ses «marques» dès le départ, je ne ferai apparaître les ovnis, et plus tard la Space Force, que pendant environ un demi-cycle du parcours de la planète Jupiter (j'aurais bien entendu pu prendre n'importe quel autre mobile de la classe Planets wink ).

   Les ovnis commenceront donc à apparaître en jupiterPosition.X > 700 soit dès le moment où la planète va disparaître de l'écran de jeu et ce, jusqu'à ce que Jupiter atteigne sa position maximale soit : jupiterPosition.X = 2000 (voir à ce sujet le chapitre 12 – La classe Planets).

   De nouveau, en position d'origine de la planète, soit en jupiterPosition.X = -700 jusqu'à la position jupiterPosition.X = -300, nous aurons encore des apparitions d'ovnis, ceux-ci ne cessant leur course qu'à partir de cette dernière position de la planète.

   Et bien entendu, l'accès à la variable jupiterPosition.X que nous devons utiliser dans notre fichier AronAndThe Aliens06.cs, nous l'obtenons à partir de la classe Planets d'où l'écriture de la ligne de notre test :

if ((planets.JupiterPosition.X > 700) && (planets.JupiterPosition.X > -300))

 

   Et c'est tout en ce qui concerne la fonction UpdateFarEnemy().


   Nous pouvons maintenant passer à la modification de la fonction Update() du fichier AronAndTheAlien06.cs. 

   Il n'y a pas grand chose à faire dans la fonction Update() et nous avons déjà parlé de cette fonction dans nos tutoriels précédents. Nous devons pourtant y reporter la mise à jour de notre fonction UpdateFarEnemies(), donc ajoutez : 

 
En -dessous de :
UpdateEnemies(gameTime);
Ajoutez :
//Mise à jour des ennemis lointains
UpdateFarEnemies(gameTime);

 

   C'est tout pour notre fonction Update(), il nous reste à compléter la fonction Draw(). Donc, dans la fonction Draw(), nous allons dessiner nos ovnis :

 

En -dessous de :
DrawHud();
Ajoutez :
// Dessine les ennemis lointains (ovnis)
for (int i = 0; i < farEnemies.Count; i++)
{
farEnemies[i].Draw(spriteBatch);
}

 

   Et vous comprendrez aisément que les ovnis étant des ennemis lointains, il est important de les dessiner directement après les planètes et le Hud. wink


   Et c'est tout pour ce chapitre. Dans le chapitre 17, tout à fait similaire à celui-ci, nous ferons défiler les astronefs de la Meruvia Space Force dans le sens opposé aux ovnis afin que puisse s'engager d'ici quelques chapitres, un combat d'arrière-plan qui va s'étendre dans toute la galaxie ! cool

   En attendant je vous propose de compiler ce projet et d'admirer la progression des ovnis dont je vous donne un screenshot ici. 

 

 

  A bientôt pour le chapitre 17 (Avec la MSF - Meruvia Space Force ! devil).

         Gondulzak.

 

 

 

Connexion

CoalaWeb Traffic

Today139
Yesterday178
This week639
This month4313
Total1743520

25/04/24