Space shooter : Aron & The Aliens

Chapitre 17 : La Meruvia Space Force

 

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

 

      Préliminaires

   Après l'invasion des sorcières aliens et des nombreux ovnis à l'intérieur de notre galaxie, la Meruvia Space Force ne pouvait pas rester sans réagir. Elle lance aussitôt ses astronefs à la rencontre de l'ennemi et envoie en même temps une patrouille de reconnaissance ! cool

   Dans ce chapitre nous allons donc introduire deux nouvelles classes, les classes SpaceForce et Patrollersmiley

   La classe SpaceForce, semblable à la classe FarEnemy, vue au chapitre précédent, n'aura pas besoin d'être expliquée. Les commentaires de celle-ci se suffisent à eux-mêmes pour comprendre la classe. Ceci va nous faire gagner un peu de place dans ce chapitre et j'en profiterai pour y introduire également la classe Patroller qui, à l'instar de la classe Planets, va se gérer par elle-même, ce qui nous fera gagner quelques lignes de codes. wink

   Jusqu'à présent, vous n'avez été que des «spectateurs» de ce qui se passait dans la fenêtre de combat mais déjà, dès le prochain chapitre, va apparaître celui que vous attendiez depuis un certain temps, car notre ami Aron dans son astronef va également se lancer dans l'espace et vous allez enfin pouvoir en prendre les commandes à l'aide des touches directionnelles.

 

Le projet « AronAndTheAliens07 »

 

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

 

     1 – Classe SpaceForce : Le code

   Vous allez maintenant commencer par créer la classe «SpaceForce». Remplacez le code existant par le code suivant :

 

#region Description
//MERUVIA XNA TUTORIALS
//Jeu : Aron and the aliens
//La Meruvia Space Force
//Fichier : SpaceForce.cs
//Last update : 06/08/2014
#endregion
 
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
 
namespace AronAndTheAliens07
{
class SpaceForce
{
#region Déclaration des variables de la classe SpaceForce
 
// Un effet sur le sprite SpaceForce
public SpriteEffects SpriteEffet;
 
// L'animation qui représente la Space Force
public Animation SpaceForceAnimation;
 
// Points de santé de la space force
public int Health;
 
// La position de la Space Force relative au coin supérieur droit de l'écran
public Vector2 Position;
 
// Etat de la Space Force
public bool Active;
 
// Vitesse de déplacement de la Space Force
float spaceForceMoveSpeed;
 
#endregion Déclaration des variables de la classe SpaceForce
 
 
#region Propriétés
 
// Renvoie la largeur du sprite Space Force
public int frameWidth
{
get { return SpaceForceAnimation.FrameWidth; }
}
 
// Renvoie la hauteur du sprite Space Force
public int frameHeight
{
get { return SpaceForceAnimation.FrameHeight; }
}
 
#endregion Propriétés
 
 
#region Fonction d'initialisation
 
public void Initialize(Animation animation, Vector2 position)
{
 
// Charge la texture de la Space Force
SpaceForceAnimation = animation;
 
// Initialise la position de la Space Force
Position = position;
 
//La Space Force est dirigée dans le sens des frames de
//la feuille de sprites
SpriteEffet = SpriteEffects.None;
 
//Initialisation des points de santé
Health = 100;
 
// Le "drapeau" Active est mis à true pour permettre à la Space Force
// de de se présenter en début de jeu
Active = true;
 
// Vitesse de la Space Force
spaceForceMoveSpeed = 0.4f;
 
}
 
#endregion Fonction d'initialisation
 
 
#region Fonction de mise à jour
 
public void Update(GameTime gameTime)
{
// La Space Force se dirige toujours de la droite vers la gauche
Position.X -= spaceForceMoveSpeed;
 
// Mise à jour de la position de l'animation
SpaceForceAnimation.Position = Position;
SpaceForceAnimation.spriteEffet = SpriteEffet;
 
// Mise à jour de l'animation
SpaceForceAnimation.Update(gameTime);
 
// Si la Space Force sort de l'écran par la gauche on la désactive
if (Position.X < 0 - frameWidth)
{
// En mettant le "drapeau" Active à false, l'objet Space Force
//est enlevé de la liste
Active = false;
}
}
 
#endregion Fonction de mise à jour
 
 
#region Fonction de dessin
 
public void Draw(SpriteBatch spriteBatch)
{
// Dessine l'animation
SpaceForceAnimation.Draw(spriteBatch);
}
 
#endregion Fonction de dessin
}
}

 

 

   Comme je l'ai indiqué dans les préliminaires, ce code peut se passer de commentaires (voyez le chapitre 16 pour plus d'information wink).
   Je conseille néanmoins à tous ceux qui désirent suivre les tutoriels Space shooter dans leur intégralité, de lire les chapitres dans l'ordre dans lequel ils ont été écrits et ce, à partir du chapitre 11.

   Nous pouvons maintenant compléter le code de notre fichier AronAndTheAliens07.cs.

 

     2 – Fichier «AronAndTheAliens07.cs» 

   On retourne maintenant dans notre fichier AronAndTheAliens07.cs. Avant toute chose, n'oubliez pas de mettre le fichier fuseeVerte.png (ci-dessus ou dans l'archive téléchargeable wink) dans le dossier Textures de votre projet si ce n'est déjà fait.

   Et à la suite de la région ENEMIES DECLARATIONS DATA'S, entrez la région suivante : 

#region SPACE FORCE DECLARATIONS DATA'S
 
Texture2D spaceForceTexture; //Texture Space Force
Random rand2 = new Random(); //Variable d'élément aléatoire
List<SpaceForce> spaceforce; //La Space Force sera gérée dans une liste
 
// La fréquence à laquelle apparait un Space Force
TimeSpan spaceForceSpawnTime;
TimeSpan previousSpaceForceSpawnTime;
 
#endregion SPACE FORCE DECLARATIONS DATA'S

 Région dans laquelle nous ajoutons les déclarations des variables représentant la Space Force.

 

   Fonction Initalize()

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

 
En -dessous de :
farEnemies = new List<FarEnemy>();
Ajoutez :
//Instanciation de la liste SpaceForce
spaceforce = new List<SpaceForce>();
 
En -dessous de :
previousFarEnemySpawnTime = TimeSpan.Zero;
Ajoutez :
previousSpaceForceSpawnTime = TimeSpan.Zero;
 
En -dessous de :
farEnemySpawnTime = TimeSpan.FromSeconds(2.5f);
Ajoutez :
//Détermine à quelle fréquence la Space Force réapparaît
spaceForceSpawnTime = TimeSpan.FromSeconds(6.0);

 

   Pour terminer, nous donnons une valeur égale à 6.0 secondes à la variable spaceForceSpawnTime, ce qui représente la fréquence d'apparition de la Meruvia Space Force à l'écran.

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

 

   Fonction LoadContent()

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

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

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

   Nous allons maintenant écrire la fonction AddSpaceForce(), qui ajoute un astronef de la Space Force à la liste des astronefs, et que nous allons placer à la suite de la mise à jour de la liste des Ennemis lointains. Donc, à la suite de la région FAR ENEMIES UPDATE LIST FUNCTION, vous entrerez la région suivante :

#region ADD SPACE FORCE TO LIST
 
//Ajoute la Space Force à la liste
private void AddSpaceForce()
{
int spaceForceType;
float spaceForceRatio = 0.0f;
spaceForceType = rand.Next(1, 3);
 
switch (spaceForceType)
{
case 1:
spaceForceRatio = 0.5f;
break;
 
case 2:
spaceForceRatio = 0.7f;
break;
 
default:
break;
}
 
// Création d'un Space Force animé
Animation spaceForceAnimation = 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
spaceForceAnimation.Initialize(spaceForceTexture,
Vector2.Zero,
80,
55,
2,
200,
Color.White,
spaceForceRatio,
true);
 
Vector2 position = new Vector2(GraphicsDevice.Viewport.Width, rand2.Next(25,
GraphicsDevice.Viewport.Height - 25));
 
//Crétation d'une Space Force
SpaceForce spaceForce = new SpaceForce();
 
// Initialisation d'un ennemi par rapport à sa position
spaceForce.Initialize(spaceForceAnimation, position);
 
// Ajout de l'ennemi à sa liste active
spaceforce.Add(spaceForce);
 
}
 
#endregion ADD SPACE FORCE TO LIST

 

   Les explications à apporter à la fonction AddSpaceForce() sont en tout point identiques à celles déjà vues dans la fonction AddFarEnemy() du chapitre 16. wink
   J'ajouterai simplement qu'outre le fait que la SpaceForce se déplace dans le sens opposé des ovnis (donc de la droite vers la gauche wink), je fais également intervenir un ratio de l'aire du sprite «fuseeVerte» afin d'afficher celle-ci avec des dimensions pratiquement égales à celles des ovnis.


   Et à la fin de cette fonction nous ajoutons un astronef à la liste des astronefs de la SF à l'aide de l'instruction :

spaceforce.Add(spaceForce);


   Nous devons maintenant mettre à jour la liste de la Space Force à l'aide de la fonction UpdateSpaceForce(), donc à la suite de la fonction AddSpaceForce() entrez la région suivante :  

 
#region SPACE FORCE UPDATE LIST FUNCTION
 
private void UpdateSpaceForce(GameTime gameTime)
{
if ((planets.JupiterPosition.X > 700) && (planets.JupiterPosition.X > -400))
{
// Génération d'un nouveau Space Force
if (gameTime.TotalGameTime - previousSpaceForceSpawnTime >
spaceForceSpawnTime)
{
previousSpaceForceSpawnTime = gameTime.TotalGameTime;
 
// Ajoute un Space Force
AddSpaceForce();
}
}
 
 
// Mise à jour des Space Force
for (int i = spaceforce.Count - 1; i >= 0; i--)
{
spaceforce[i].Update(gameTime);
 
// Si l'état est inactif
if (spaceforce[i].Active == false)
spaceforce.RemoveAt(i);
 
}
}
 
#endregion SPACE FORCE UPDATE LIST FUNCTION

 

   Cette fonction va dans un premier temps générer un nouvel astronef toutes les 6.0 secondes et l'ajouter à la liste des astronefs par l'appel à la fonction AddSpaceForce() que nous venons de voir plus haut. wink

   Nous parcourons ensuite toute la liste des astronefs afin de permettre leur mise à jour et de 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 spaceforce.RemoveAt(i);

   Quant aux explications à apporter sur le test de la position de la planète Jupiter, ce sont bien sûr les mêmes que celles apportées dans le chapitre 16. 

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


   Nous pouvons maintenant passer à la modification de la fonction Update() du fichier AronAndTheAlien07.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 UpdateSpaceForce(), donc en-dessous de : 

 
En -dessous de :
UpdateFarEnemies(gameTime);
Ajoutez :
//Mise à jour de la space force
UpdateSpaceForce(gameTime);

 

   C'est tout pour notre fonction Update(), il nous reste à compléter la fonction Draw(), où nous allons dessiner nos astronefs. 

 

En -dessous de :
for (int i = 0; i < farEnemies.Count; i++)
{
farEnemies[i].Draw(spriteBatch);
}
Ajoutez :
// Dessine la Space Force
for (int i = 0; i < spaceforce.Count; i++)
{
spaceforce[i].Draw(spriteBatch);
}

 

     3 – La Classe «Patroller»

   Nous allons maintenant ajouter une patrouille de 2 astronefs en premier plan de la scène de jeu. Ceux-ci n'étant pas destinés à entrer en interaction avec les autres mobiles, nous allons écrire tout le code dans la classe elle-même.

   Vous pouvez maintenant créer la classe «Patroller» et remplacer le code existant par le code suivant : 

 
#region Description
//MERUVIA XNA TUTORIALS
//AronAndTheAliens07
//Game : Aron and the aliens
//Ajoutons une patrouille du Meruvia Space Center
//Fichier : Patroller.cs
//Last update : 06/08/2014
#endregion
 
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Content;
 
namespace AronAndTheAliens07
{
class Patroller
{
#region PATROLLER DECLARATIONS DATA'S
Texture2D patrollerTexture;
Vector2 patrollerPosition;
Vector2 patroller2Position;
 
//Données patrollers
int patrollerWidth;
int patrollerHeight;
int patrollerOrigin;
int patroller2Origin;
int patroller2MaxPos;
int patrollerMaxPos;
int patrollerPositionChoice = 0; //Variable pour position aléatoire du
                                 //patroller
 
Random rand = new Random(); //Variable d'élément aléatoire
 
//Vitesse de déplacement du patroller
float patrollerMoveSpeed;
#endregion PATROLLER DECLARATIONS DATA'S
 
 
#region CONSTRUCTOR
//Constructeur
public Patroller(ContentManager content)
{
//Texture Patrouilleur
patrollerTexture= content.Load<Texture2D>("Textures/fuseeVerte");
 
//Dimensions, origine et position maxi des patrouilleurs
patrollerWidth = 80;
patrollerHeight = 55;
patrollerOrigin = 25000;
patrollerMaxPos = -25000;
patroller2Origin = 25050;
patroller2MaxPos = -24950;
 
//Positions initiales des patrouilleurs
patrollerPosition = new Vector2(25000, 150);
patroller2Position = new Vector2(25050, 170);
 
//Vitesse des patrouilleurs
patrollerMoveSpeed = 12.0f;
}
#endregion CONSTRUCTOR
 
 
#region PATROLLER UPDATE FUNCTION
public void UpdatePatroller()
{
//Vitesse de déplacement des patrouilleurs
patrollerPosition.X -= patrollerMoveSpeed;
patroller2Position.X -= patrollerMoveSpeed;
 
//Si les patrouilleurs vont au-delà de leurs position maxi, on leur donne de
//nouvelles positions aléatoires avant de les réafficher
if ((patrollerPosition.X <= patrollerMaxPos) &&
                      (patroller2Position.X <= patroller2MaxPos))
{
patrollerPositionChoice = rand.Next(1, 4);
switch (patrollerPositionChoice)
{
case 1:
patrollerPosition.Y = 50;
patroller2Position.Y = 70;
break;
 
case 2:
patrollerPosition.Y = 200;
patroller2Position.Y = 220;
break;
 
case 3:
patrollerPosition.Y = 330;
patroller2Position.Y = 350;
break;
 
default:
break;
}
 
patrollerPosition.X = patrollerOrigin;
patroller2Position.X = patroller2Origin;
}
}
#endregion PATROLLER UPDATE FUNCTION
 
 
#region DRAW FUNCTION
public void Draw(SpriteBatch spriteBatch)
{
 
//Dessine le Patrouilleur 1
spriteBatch.Draw(patrollerTexture,
patrollerPosition,
new Rectangle(0, 0, patrollerWidth, patrollerHeight),
Color.White,
0.0f,
Vector2.Zero,
1.5f,
SpriteEffects.None,
1.0f);
 
//Dessine le Patrouilleur 2
spriteBatch.Draw(patrollerTexture,
patroller2Position,
new Rectangle(0, 0, patrollerWidth, patrollerHeight),
Color.White,
0.0f,
Vector2.Zero,
2.0f,
SpriteEffects.None,
1.0f);
 
}
#endregion DRAW FUNCTION
 
}
}

 

   Je ne ferai pas de commentaires spéciaux pour cette classe. Ils sont semblables aux commentaires apportés dans la classe Planets du chapitre 11.

   Nous devons cependant à nouveau compléter notre fichier AronAndTheAliens07.cs et en premier lieu faire référence à notre classe Patroller.

   Dans la région CLASSES REFERENCES, en dessous de : 

 
En -dessous de :
Planets planets;
Ajoutez :
Patroller patroller;

 

  Nous créons ensuite une instance de la classe. Donc dans la fonction LoadContent(), à l'intérieur de la région CLASSES INSTANCES, en dessous de :

 

En -dessous de :
planets = new Planets(Content);
Ajoutez :
patroller = new Patroller(Content);

 

   Nous pouvons maintenant mettre à jour la fonction Update().

 

En -dessous de :
UpdateSpaceForce(gameTime);
Ajoutez :
//Mise à jour de la patrouille
patroller.UpdatePatroller();

 

  Il nous reste à compléter la fonction Draw(), donc en dessous de :

 

En -dessous de :
for (int i = 0; i < spaceforce.Count; i++)
{
spaceforce[i].Draw(spriteBatch);
}
Ajoutez :
// Dessine la patrouille
patroller.Draw(spriteBatch);

 

   La patrouille devant être dessinée à l'avant-plan de la scène de jeu, c'est donc en dernière position dans la fonction Draw() que nous écrirons ce code. wink

   Et c'est tout pour ce chapitre ! Dans le chapitre 18, comme je vous l'ai annoncé au début de celui-ci, Aron, notre héros de l'Espace, fera son apparition sur la scène de combat et vous allez enfin pouvoir prendre les commandes de son astronef ! cool

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

 

 

    A bientôt pour le chapitre 18 (Aron à la rescousse) ! smiley

            Gondulzak.

 

 

 

Connexion

CoalaWeb Traffic

Today209
Yesterday297
This week1006
This month4680
Total1743887

26/04/24