Space shooter : Aron & The Aliens

Chapitre 20 : Mise en place d'un menu – la classe «Scripts»

 

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

 

 Loin, très loin dans les profondeurs de l'Espace
l'Alliance doit faire face à une nouvelle menace.
Des sorcières aliens, dotées de puissants missiles
ont envahi toute la Galaxie.
Et maintenant, rassemblées près de la Ceinture d'Astéroïdes
se dirigent vers la Terre où la défense se prépare.
Aron,un valeureux astronaute, décide d'engager le combat
en tant que leader de la Meruvia Space Force
et rejoint aussitôt la base militaire où l'attend son astronef.

                                                                                                   

      Préliminaires

   Lors de notre précédent chapitre, nous avons intégré des power-ups dans la fenêtre de combat et je vous ai rappelé combien ceux-ci allaient se révéler très importants pour la survie de notre astronaute. wink

   Nous voici arrivés à un moment important de notre projet, celui où nous allons devoir gérer toutes nos collisions mais avant cela, il nous reste une chose à faire. Nous allons en effet maintenant mettre notre menu en place et écrire une nouvelle classe, la classe «Scripts». Ceci va nous donner pas mal de boulot mais, croyez-moi, une fois ce chapitre terminé nous nous serons déjà ôté une belle épine du pied... cool

   Pourquoi une classe Scripts ? surprise  Eh bien, celle-ci va contenir tous les écrits qui seront apportés dans notre jeu. Le nom s'imposait donc tout naturellement. cheeky  C'est bien entendu par l'écriture de cette classe qu'il nous faudrait commencer ce chapitre mais en premier lieu nous avons quelques ajouts à faire dans notre classe «Hero». Je vous ai, en effet, déjà signalé ailleurs que celle-ci devrait être complétée au fur et à mesure de l'avancement de nos chapitres. wink

Le projet « AronAndTheAliens10 »

 

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

 

 

     1 – Complétons notre classe Hero

   Dans la région Déclaration des variables de la classe Hero, ajoutez :

 
En -dessous de :
public int health;
Ajoutez :
//Nb de pièces d'or acquises par le héros
public double gold;
 
//Nb de points de boucliers détenus par le héros
public int shield;
 
//Nb de barrels d'energie détenus par le héro
public int energyBarrels;
 
//Score obtenu par le héros
public double score;
 
//Distance parcourue par l'astronef. Sera comptabilisée dans
//AronAndTheAliens10.cs par gestion des touches directionnelles
public int distance;
 
// Unités inter galactiques restantes avec un tonneau d'énergie
public int availableGalacticUnits;
 
// Au départ, les réservoirs d'énergie de l'astronef sont à leur maximum
public bool noMoreEnergy = false;
 
//Au départ du jeu on est en mode menu
public bool onCombatWindow = false;

 

   Nous allons en effet bientôt écrire dans notre Hud les valeurs, qui au départ du jeu, composent les éléments de celui-ci.

   Donc, dans la fonction Initialize() de la classe Hero, ajoutez :

 
En -dessous de :
health = 100;
Ajoutez :
// Gold acquis au départ du jeu
gold = 0;
 
// Points de boucliers acquis au départ du jeu
shield = 0;
 
// Nombre de tonneaux d'énergie au départ du jeu
energyBarrels = 3;
 
// Score au départ du jeu
score = 0;
 
// Au départ, la distance parcourue par l'astronef est égale à 0.
distance = 0;
 
// Un tonneau d'énergie permet d'accomplir une distance de 1500 GU
availableGalacticUnits = 1500;

 

   Fonction dans laquelle nous mettons trois unités de tonneaux d'énergie dans notre variable energyBarrels. Ces 3 tonneaux d'énergie vont donc nous permettre au départ du jeu, comme je vous l'ai signalé lors du précédent chapitre sur les power-ups, de parcourir (3 x 1500) unités de déplacement intergalactique. Dans ce chapitre nous allons d'ailleurs expérimenter le fait que l'astronef tombe à cours d'énergie si la variable availableGalacticUnits atteint la valeur 0 et nous afficherons à cet effet une nouvelle fenêtre indiquant le type de mort d'Aron.

   Quant au booléen onCombatWindow, il permettra, selon son état (false ou true) d'ouvrir soit la fenêtre de menu soit la fenêtre de combat. wink

 

     2 – Classe Scripts : le code

   Voilà, je crois que nous pouvons maintenant créer notre nouvelle classe, la classe «Scripts». Remplacez le code existant par le code suivant : 

 
#region Description
//MERUVIA XNA TUTORIALS
//AronAndTheAliens10
//Jeu : Aron and the aliens
//Scripts divers
//Fichier : Scripts.cs
//Last update : 31/08/2014
#endregion
 
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
 
namespace AronAndTheAliens10
{
class Scripts : AronAndTheAliens10
{
#region Function MenuScript
public void MenuScript(SpriteBatch spriteBatch, SpriteFont font, SpriteFont font3)
{
// Une introduction à notre jeu
//Création d'un tableau de strings
string[] scripts = new string[]
{ "Far, far away in the deepness of the Space",
"The Alliance must face a new threat.",
"Aliens sorceres, with powerfull missils,",
"have invaded all the Galaxy",
"And now gathered near the asteroids area,",
"are moving to the Earth where defense is preparing.",
"Aron, a valorous astronaut, has decided to engage the combat",
"as a leader of the Meruvia Space Force",
"and soon reach the military base where his astronef is waiting." };
 
// Le titre de notre jeu
spriteBatch.DrawString(font, "Aron and the Aliens",
new Vector2(base.Window.ClientBounds.Width / 2 -
font.MeasureString("Aron and the Aliens").X / 2,
75), Color.White);
 
//Position sur l'axe Y du premier élément du tableau dans la fenêtre
int y = 150;
 
//Ecriture des scripts
foreach (string script in scripts)
{
spriteBatch.DrawString(font3, script,
new Vector2(base.Window.ClientBounds.Width / 2 -
font3.MeasureString(script).X / 2,
y), Color.White);
y += 25;
}
 
}
#endregion Function MenuScript
 
 
#region Function DrawHud
// Affichage des acquis du joueur
public void DrawHud(SpriteBatch spriteBatch, GameTime gameTime,
SpriteFont font2, Hero hero)
{
 
spriteBatch.DrawString(font2, "Health : " + hero.health,
new Vector2(15, 20),
Color.White);
 
spriteBatch.DrawString(font2, "Shield : " + hero.shield,
new Vector2(15 + 135, 20),
Color.White);
 
spriteBatch.DrawString(font2, "Energy barrels : " + hero.energyBarrels,
new Vector2(15 + 260, 20), Color.White);
 
spriteBatch.DrawString(font2, "Gold : " + hero.gold, new Vector2(15 + 475,
20),
Color.White);
spriteBatch.DrawString(font2, "Score : " + hero.score,
new Vector2(15 + 605, 20),
Color.White);
}
#endregion Function DrawHud
 
 
#region Function Challenge
public void Challenge(SpriteBatch spriteBatch, GameTime gameTime, SpriteFont font2, SpriteFont font3, Hero hero)
{
if (hero.gold >= 200)
{
spriteBatch.DrawString(font3,
"Earn 200 gold to get a barrel", new Vector2(15, 45), Color.White);
}
else
{
if (gameTime.TotalGameTime.Milliseconds % 1000 < 500)
spriteBatch.DrawString(font3,
"Earn 200 gold to get a barrel", new Vector2(15, 45), Color.Red);
}
 
spriteBatch.DrawString(font3,
"Reach the Earth to buy a 50 pts Shield (200 po) or a 250 pts Supershield (500 po)",
new Vector2(15, 430),
Color.White);
 
spriteBatch.DrawString(font2,
"Kill a maximum of aliens but be aware of missils and asteroids !",
new Vector2(15, 450),
Color.White);
}
#endregion Function Challenge
 
 
#region Function StatesWarnings
public void StatesWarnings(Hero hero, SpriteBatch spriteBatch, SpriteFont font2,
SpriteFont font3, GameTime gameTime )
{
if (hero.health <= 25)
{
if (gameTime.TotalGameTime.Milliseconds % 1000 < 500)
spriteBatch.DrawString(font2, "Health : " + hero.health,
new Vector2(15, 20),
Color.Red);
}
else
spriteBatch.DrawString(font2, "Health : " + hero.health,
new Vector2(15, 20),
Color.White);
 
if (hero.energyBarrels == 1)
{
if (gameTime.TotalGameTime.Milliseconds % 1000 < 500)
spriteBatch.DrawString(font2, "Energy barrels : "
hero.energyBarrels,
new Vector2(15 + 260, 20),
Color.Red);
 
spriteBatch.DrawString(font3,
"Inter Galactic Distance Energy Units available : " +
hero.availableGalacticUnits, new Vector2(15, 65), Color.Red);
}
else
spriteBatch.DrawString(font2, "Energy barrels : "
+ hero.energyBarrels,
new Vector2(15 + 260, 20), Color.White);
}
#endregion Function StatesWarnings
 
 
#region Function type of death
public void TypeOfDeath(SpriteBatch spriteBatch, SpriteFont font2, Hero hero,
GameTime gameTime)
{
 
if (hero.noMoreEnergy == true)
{
spriteBatch.DrawString(font2, "No more Energy ,
you are lost in Space !",
new Vector2(this.Window.ClientBounds.Width / 2 -
font2.MeasureString("No more Energy , you are lost in Space !").X / 2,
220), Color.White);
 
if (gameTime.TotalGameTime.Milliseconds % 1000 < 500)
spriteBatch.DrawString(font2, "Press ENTER to start",
new Vector2(30, 410), Color.Gold);
}
 
}
#endregion Function type of death
 
}
}

 

   Nous avons pas mal de choses à expliquer au sujet de notre classe «Scripts» et nous allons le faire fonction par fonction. Mais auparavant, remarquez que je fais dériver cette classe de la classe «AronAndTheAliens10» en écrivant:

class Scripts : AronAndTheAliens10

   Nous allons tout de suite voir pourquoi à l'intérieur de la fonction MenuScript().

   Vous voyez d'autre part que la classe ne possède pas de constructeur ? surprise  Eh bien, puisque cette classe est destinée à recevoir des fonctions d'écriture de divers scripts, nous n'en avons simplement pas besoin ! wink
   Voyons maintenant les fonctions que contient cette classe.

 

   Fonction MenuScript()

   Premièrement, nous voyons que nous passons une variable de type SpriteBatch et deux autres de type SpriteFont à la fonction. Effectivement nous aurons besoin d'y écrire deux polices de hauteurs différentes, font et font3smiley

   Nous initialisons ensuite un tableau de chaînes de caractères qui va contenir la préface du menu de notre jeu. Remarquez que le texte anglais de la chaîne est celui qui est écrit en italique et en français tout au début du chapitre, je n'aurai donc pas besoin de vous en faire une traduction. wink

   Une des possibilités du C# est de pouvoir créer une chaîne de caractères sans donner a priori la longueur de la chaîne, et c'est ce que nous faisons ici :

string[] scripts = new string[] 

   Notez que la chaîne contenant 8 lignes de texte, nous aurions également pu écrire :

string[] scripts = new string[8]

   Mais cela n'est pas nécessaire. devil Et pour la lecture de cette chaîne, nous allons utiliser une nouvelle instruction conditionnelle, inconnue du langage C ou du C++ mais qui existe en C#, il s'agit de l'instruction foreach. Nous allons tout de suite y revenir. wink

 

   Le titre de notre jeu est écrit par la méthode DrawString() sous une forme spéciale. Celle-ci, en effet, va écrire notre titre en une position centrée sur notre écran. En effet, l'expression «ClientBounds.Width» contient implicitement les dimensions de notre écran tandis que la méthode MeasureString() de la classe SpriteFont calcule la longueur de notre chaîne. L'expression entière centre directement le titre sur notre écran en une position choisie en y = 75.

   Plus joli et plus rapide qu'en C, non ? cool

 

   Maintenant, souvenez-vous que j'ai fait dériver la classe Scripts de la classe AronAndTheAliens10.
   En effet, les dimensions de notre fenêtre ne sont connues que de notre classe de base, d'où l'expression base.Window.ClientBounds.Width / 2. Notez que j'aurais pu utiliser le pointeur this à la place de base et que les expressions base.Window.ClientBounds.Width ou this.Window.ClientBounds.Width sont strictement équivalentes dans ce cas.

   Ensuite, avant l'écriture du texte on positionne la première phrase en y = 150 avec un delta y de 25 pixels pour les autres.

 

   L'instruction foreach est très simple. On initialise une variable script de type String qui va successivement écrire toutes les phrases de la chaîne en les centrant automatiquement sur l'écran grâce à l'expression que nous venons de voir plus haut.

   Et c'est tout pour notre première fonction de la classe Scripts, nous passons à la suivante. smiley


   Fonction DrawHud()

   Oui, j'entends certains d'entre-vous dire : Mais qu'es-ce qu'il nous fait là, Gondulzak ? angry

   La fonction DrawHud a déjà été écrite dans la classe AronAnTheAliens09... indecision

   C'est exact cheeky ! Eh bien, enlevez-la simplement de la classe AronAndTheAliens10 car je la réintègre dans la classe Scripts avec quelques ajouts. En effet, cette fois quand nous allons dessiner notre Hud, nous allons y ajouter les valeurs de départ de nos acquis que nous n'avions pas introduits dans le précédent chapitre. Dans cette fonction, nous ajoutons donc les valeurs initiales de hero.health, hero.shield, hero.energyBarrels, hero.gold et hero.score. Et comme ces variables ont été déclarées et initialisées dans la classe Hero, nous passons une instance de cette classe à la fonction de même qu'une instance de la classe SpriteFont afin d'écrire la police avec les dimensions de font2 (souvenez-vous bien de ceci quand, dans une fonction, vous devrez utiliser des variables initialisées dans une autre classe wink).

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

 

   Fonction Challenge()

   Que fait cette fonction ? surprise Eh bien, en gros, elle affiche tout ce qu'il y a lieu de faire pour permettre à l'astronef de voyager le plus longtemps possible sans se faire exploser par un astéroïde ou une affreuse sorcière alien !

   Dans un premier temps, nous affichons la ligne de texte "Earn 200 gold to get a barrel" soit en français «Amassez 200 pièces d'or pour acheter un tonneau». Ah Ah... smiley Eh oui, lors de la gestion de nos collisions il vous faudra au moins 200 po pour vous saisir de votre premier power-up ! devil Comment ? frown Mais en explosant des aliens bien sûr ! laugh Et vous vous apercevrez que tant que vous n'aurez pas amassé cette somme, la ligne de texte va clignoter en couleur rouge ! cheeky

   Notre seconde ligne de texte affiche "Reach the Earth to buy a 50 pts Shield (200 po) or a 250 pts Supershield (500 po)" que j'ai modifié dès ce chapitre et qui veut dire «Rejoignez la Terre pour acheter un bouclier de 50 pts pour 200 po ou un super bouclier de 250 pts pour 500 po» (pour autant que vous ayez cette somme, bien entendu ! cheeky).

   Et enfin, nous connaissons la signification de la troisième ligne de texte affichée qui je vous le rappelle, veut dire «Tuez un maximum d'aliens mais prenez garde aux missiles et aux astéroïdes».

   Et c'est tout en ce qui concerne notre fonction «Challenge()».


   Fonction StatesWarnings()

   Cette fonction veut dire : Alertes d'états. Son but, entre autres, est d'avertir le joueur si une valeur acquise d'importance devenait dangereusement basse. angel

   Nous commençons par la santé et nous voyons que celle-ci sera coloriée en rouge si sa valeur atteint un quart de sa valeur initiale, soit 25 points.

   Ensuite, dès que la quantité d'energyBarrel est égale à 1, nous le signalons en la faisant clignoter en rouge et nous affichons la décroissance des 1500 dernières unités galactiques contenues dans la variable availableGalacticUnits jusqu'à ce que celles-ci tombent à 0. Nous allons en voir les conséquences dans la fonction UpdateHero() de notre classe AronAndTheAliens10.

   La traduction de la phrase "Inter Galactic Distance Energy Units available : " veut dire : «Unités d'énergie de distance inter galactique restantes».

   Et c'est tout en ce qui concerne la fonction «StateWarnings()».


   Fonction TypeOfDeath()

   Une chose qui me semble utile est aussi de signaler dans une nouvelle fenêtre et après chaque mort d'Aron, dans quoi celui-ci s'est pris les pieds... laugh je veux dire ce qui a provoqué le crash de l'astronef. wink
   Et c'est ce qui va être écrit dans cette fonction, en commençant par ce premier crash que nous connaissons depuis ce chapitre, c'est à dire le manque d'énergie !

   On teste donc la variable booléenne noMoreEnergy et si celle-ci est vraie on écrit la phrase : "No more Energy , you are lost in Space !" qui en français veut dire : «Manque d'énergie , vous vous perdez dans l'Espace !».

   Et on recommence un nouveau jeu en pressant la touche «Enter» ou le bouton correspondant du gamepad. wink

   Cette fonction sera bien entendu complétée par la suite au fur et à mesure de nos différentes collisions mais en attendant, c'est ici que l'on arrête nos explications au sujet de la classe Scripts et nous pouvons maintenant procéder aux ajouts que nous avons à effectuer dans le fichier AronAndTheAliens10.cs.

   Avant cela, dans la fenêtre de l'explorateur de solutions, faites un clic droit sur AronAndTheAliens10Content(Content) et ajoutez un nouveau dossier que vous nommerez Menu.
   A l'intérieur de ce dossier vous ajouterez les 3 textures suivantes livrées avec le projet :
MenuScreen.jpg
Astronef.png
Sorciere.png
  

     3 – Classe AronAndTheAlien10

   Dans la région CLASSES REFERENCES, ajoutez :

 
En -dessous de :
Hero hero;
Ajoutez :
Scripts scripts;

 

   Et en dessous de la région POWER_UP DECLARATIONS DATA'S ajoutez la région suivante :

 
#region MENU DECLARATIONS DATA'S
 
Texture2D menuScreenTexture; //Image Menu
Texture2D astronefTexture; //Texture sprite astronef
Texture2D sorciereTexture; //Texture sprite sorcière
 
#endregion MENU DECLARATIONS DATA'S

 

   Il s'agit là des déclarations des textures qui seront appliquées sur notre fenêtre de menu.

   Passons maintenant à la fonction Initialize(). A l'intérieur de la région INITIALIZE ANIMATIONS DATA'S, juste en dessous de :

 
En -dessous de :
hero = new Hero();
Ajoutez :
//Instanciation de la classe Scripts
scripts = new Scripts();

 

   Et nous passons à la fonction LoadContent(). A l'intérieur de la région TEXTURES, à la suite de :

 
En -dessous de :
barrelTexture = Content.Load<Texture2D>("Textures/Baril_27x32");
Ajoutez :
//Images Menu
menuScreenTexture = Content.Load<Texture2D>("Menu/MenuScreen");
astronefTexture = Content.Load<Texture2D>("Menu/Astronef");
sorciereTexture = Content.Load<Texture2D>("Menu/Sorciere");

 

   Quelques nouvelles fonctions

   On continue. smiley Nous allons maintenant écrire la fonction qui dessine les textures de background de notre menu (Comme vous le voyez, je découpe le projet en un maximum de fonctions pour une organisation plus facile, j'espère... wink).
   Ok, en dessous de la région FUNCTION UNLOADCONTENT, entrez la région suivante :

 
#region BACKGROUND MENU
 
private void DrawBackgroundMenu(SpriteBatch spriteBatch)
{
spriteBatch.Draw(menuScreenTexture, Vector2.Zero, Color.White);
spriteBatch.Draw(astronefTexture, new Vector2(640, 200), Color.White);
spriteBatch.Draw(sorciereTexture, new Vector2(100, 200), Color.White);
}
 
#endregion BACKGROUND MENU

 

   Région dans laquelle nous créons notre fonction DrawBackgroundMenu().

   Maintenant, nous allons écrire la fonction DrawMenu(). Donc à la suite de la région BACKGROUND MENU, entrez la région suivante :

 
#region MENUSCREEN
 
private void DrawMenu(SpriteBatch spriteBatch, GameTime gameTime)
{
scripts.MenuScript(spriteBatch, font, font3);
 
if (gameTime.TotalGameTime.Milliseconds % 1000 < 500)
{
spriteBatch.DrawString(font2, "Press ENTER to start",
new Vector2(30, 410), Color.Gold);
}
}
 
#endregion MENUSCREEN

 

   La première ligne de notre fonction appelle la fonction MenuScript() de notre classe Scripts qui va écrire le titre du jeu ainsi que la chaîne de caractères qui contient sa préface. Un appui sur la touche «Enter» ou sur le bouton correspondant du gamepad démarre alors notre jeu. wink

   Bien, il nous faut maintenant tester la quantité restante d'energyBarrel de notre astronef. Nous allons donc écrire une nouvelle fonction que nous appellerons «TestEnergy()». Juste avant la région HERO UPDATE FUNCTION entrez la région suivante : 

 
#region ASTRONEF ENERGY TEST FUNCTION
 
private void TestEnergy()
{
if (hero.distance >= 1500)
{
hero.energyBarrels -= 1;
hero.distance = 0;
}
 
if (hero.energyBarrels == 1)
hero.availableGalacticUnits -= 1;
else
hero.availableGalacticUnits = 1500;
 
if (hero.availableGalacticUnits <= 0)
{
hero.noMoreEnergy = true;
hero.health = 0;
hero.Active = false;
hero.onCombatWindow = false;
}
}
 
#endregion ASTRONEF ENERGY TEST FUNCTION

 

   Notre premier test fait que, à chaque distance parcourue de 1500 unités intergalactiques, notre quantité de tonneaux d'énergie est décrémentée d'une unité et nous réinitialisons la variable distance à 0.


   Dès que l'astronef n'a plus qu'un tonneau d'énergie en stock, nous faisons décroitre la variable availableGalacticUnits de 1500 à 0. Quand cette variable atteint la valeur 0, on met le booléen noMoreEnergy à true, la santé à 0 et on quitte la zone de combat avec le booléen onCombatWindow qui devient faux. La fonction TypeOfDeath() de la classe Scripts prend alors la relève et indique le type de crash subi par l'astronef.


   Mises à jour

   Et c'est bien entendu dans la fonction UpdateHero() que nous allons appeler la fonction TestEnergy(). Donc, dans la fonction UpdateHero(), dans chaque test de flèche pressée, juste avant les modifications de la variable hero.Position, nous faisons appel à TestEnergy().

   Après chaque mort du héros, nous devons réinitialiser nos valeurs du Hud avec les valeurs initialisées au départ du jeu et pour ce faire nous écrivons la fonction ResetGame(). Donc à la suite de la région HERO UPDATE FUNCTION, entrez la région suivante :

 
#region RESET VARIABLES TO START AGAIN
 
private void ResetGame()
{
hero.health = 100;
hero.energyBarrels = 3;
hero.distance = 0;
}
 
#endregion RESET VARIABLES TO START AGAIN

 

   Et où allons-nous faire appel à notre fonction ResetGame() ? blush  Mais dans notre fonction Update() bien sûr, et au moment où l'on presse la touche «Enter» du clavier ou le bouton «Start» du gamepad ! wink
   Donc, dans la fonction Update(), en dessous de la ligne :

 
En -dessous de :
currentGamePadState = GamePad.GetState(PlayerIndex.One);
Ajoutez :
//On démarre le jeu en pressant "Enter"
if (currentKeyboardState.IsKeyDown(Keys.Enter) ||
         currentGamePadState.Buttons.Start == ButtonState.Pressed)
{
// On entre en mode jeu
hero.onCombatWindow = true;
ResetGame();
}

 

   Terminé pour la fonction Update(), il nous reste à modifier la fonction Draw()cheeky


   Fonction Draw()

   Dans la fonction Draw(), si vous n'aviez pas encore enlevé l'appel à la fonction DrawHud(), faites-le maintenant.

 
En -dessous de :
planets.Draw(spriteBatch);
Ajoutez :
//Début du jeu
scripts.DrawHud(spriteBatch, gameTime, font2, hero);
scripts.Challenge(spriteBatch, gameTime, font2, font3, hero);
scripts.StatesWarnings(hero, spriteBatch, font2, font3, gameTime);

 

   Ce sont des appels aux fonctions vues dans notre classe Scripts. Ensuite, en-dessous du dessin de la patrouille, donc de la ligne :

 
En -dessous de :
patroller.Draw(spriteBatch);
Ajoutez :
// Si on n'est plus en mode jeu, on indique de quelle façon l'astronef
// a été détruit
if (hero.onCombatWindow == false)
{
DrawBackgroundMenu(spriteBatch);
 
if (hero.health <= 0)
{
scripts.DrawHud(spriteBatch, gameTime, font2, hero);
scripts.TypeOfDeath(spriteBatch, font2, hero, gameTime);
}
 
// Mode menu
else
DrawMenu(spriteBatch, gameTime);
}

 

   Ces instruction parlent d'elles-mêmes, nous les avons déjà vues précédemment. wink

   Avant de terminer ce chapitre, j'aurais aimé ajouter une dernière chose. Il m'est venu à l'esprit de réaliser un affichage en temps réel de la position de la galaxie, du gros astéroïde et des planètes dans leur champ de déplacement. Il me semble intéressant qu'au cours du jeu on puisse toujours connaitre la position de la Terre par rapport à la fenêtre de combat pour appliquer telle stratégie si nous devons encore attendre un certain temps avant d'obtenir un super bouclier par exemple. cool

   Ok, on se lance et cela prendra peu de temps. wink Cliquez sur votre fichier Planets.cs dans l'explorateur de solutions et à la suite du dessin du Big Asteroid au premier plan, donc en fin de région, ajoutez les lignes suivantes : 

 
// Affiche la position en temps réel des planètes dans leur
// champ de déplacement
spriteBatch.DrawString(font3, "Galaxy : " + (int)galaxyPosition.X,
                                              new Vector2(5, 280), Color.Green);
 
spriteBatch.DrawString(font3, "Asteroid : " + (int)bigAsteroidPosition.X,
                                              new Vector2(5, 300), Color.Green);
 
spriteBatch.DrawString(font3, "Venus : " + (int)venusPosition.X,
                                              new Vector2(5, 320), Color.Green);
 
spriteBatch.DrawString(font3, "Earth : " + (int)earthPosition.X,
                                              new Vector2(5, 340), Color.Green);
 
spriteBatch.DrawString(font3, "Moon : " + (int)moonPosition.X,
                                              new Vector2(5, 360), Color.Green);
 
spriteBatch.DrawString(font3, "Jupiter : " + (int)jupiterPosition.X,
                                              new Vector2(5, 380), Color.Green);

 

   Et, toujours dans la classe «Planets», on n'oublie surtout pas de remplacer le nom de la fonction :

 

Remplacez :

public void Draw(SpriteBatch spriteBatch)

Par :

public void Draw(SpriteBatch spriteBatch, SpriteFont font3)

 

   Et de même, dans la fonction Draw() du fichier AronAndTheAliens10.cs

 
Remplacez :
planets.Draw(spriteBatch);
Par :
planets.Draw(spriteBatch, font3);

 

    Et voilà, ce chapitre est enfin terminé. cheeky Je vais maintenant vous montrer quelques screenshots du crash de l'astronef par manque d'énergie. Mais compilez ce projet et expérimentez vous-même les déplacements de l'astronef en pressant les flèches du clavier ou du gamepad et surveillez la valeur de l'élément Energy barrels.

   Dans le prochain chapitre où nous allons introduire nos premières collisions, vous pourrez vous saisir de power-ups et rejoindre la Terre pour acheter un super bouclier, par exemple. En attendant, voici les screenhots capturés au cours de ce chapitre.

 
 
Notre menu
 
 
Le nombre d'Energy barrels est à son maximum
 
 
  Il ne reste plus qu'un tonneau d'énergie, la variable availableEnergyUnit va être décrémentée de 1500 à 0 si l'on continue à presser les flèches directionnelles.
 
 
Les unités d'énergie sont tombées à zéro. Crash de l'astronef, on recommence une partie !

 

   A bientôt pour le chapitre 21 (Les Collisions – partie I). smiley

         Gondulzak.

 

 

Connexion

CoalaWeb Traffic

Today115
Yesterday232
This week1141
This month3434
Total1742641

20/04/24