Space shooter : Aron & The Aliens

Chapitre 18 : Aron à la rescousse

 

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

 

      Préliminaires

    Les ovnis envahissent l'Espace, en appui aux sorcières aliens. En face, la Meruvia Space Force s'apprête à engager un combat qui décidera du sort de la galaxie et le Général en chef de la MSF a décidé de mettre un nouvel astronaute aux commandes de l'escadrille. Celui-ci n'est autre que Aron, le héros que nous attendions tous, et qui se lance à son tour à la rescousse de la flotte.

   Dans ce chapitre, nous allons introduire une nouvelle classe, et puisque Aron est le héros de notre aventure, nous dénommerons simplement celle-ci «Hero» (Note de Jay : Héros prend un S en français, mais pas en anglais, faut pas chercher... cheeky). Cette classe sera dans un premier temps très minimaliste car ce chapitre n'a pour but que le déplacement de l'astronef dans les 4 directions. Mais notre classe «Hero» s'étoffera très vite et notamment en ce qui concerne les collisions que nous allons bientôt mettre en oeuvre à la suite des deux prochains chapitres qui porteront l'un sur l'introduction des power-ups dans notre fenêtre de jeu et l'autre sur la mise en place d'un menu simple.

Le projet « AronAndTheAliens08 »

 

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

 

 

     1 – Classe Hero : Le code

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

 

#region Description
//MERUVIA XNA TUTORIALS
//AronAndTheAliens08
//Jeu : Aron and the aliens
//Aron à la rescousse
//Hero.cs
//Last update : 17/08/2014
#endregion
 
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
 
namespace AronAndTheAliens08
{
class Hero
{
#region Déclaration des variables de la classe Hero
 
// L'animation qui représentera le sprite
public Animation HeroAnimation;
 
// Position du sprite à partir du coin supérieur gauche de l'écran
public Vector2 Position;
 
// Un effet sur le sprite
//public SpriteEffects SpriteEffet;
 
// Etat du sprite
public bool Active;
 
//Nb de points de santé du héro
public int health;
 
//Vitesse de l'astronef
public float speed;
 
#endregion Déclaration des variables de la classe Hero
 
 
#region Accesseurs
// Un accesseur permettant de retrouver la largeur d'une frame de l'animation
public int frameWidth
{
get { return HeroAnimation.FrameWidth; }
}
 
// Un accesseur permettant de retrouver la hauteur d'une frame de l'animation
public int frameHeight
{
get { return HeroAnimation.FrameHeight; }
}
#endregion Accesseurs
 
 
#region Fonction d'initialisation
// Initialisation du sprite animé, de sa position et de l'effet désiré
public void Initialize(Animation animation, Vector2 position)
{
HeroAnimation = animation;
 
this.Position = position;
//this.SpriteEffet = spriteEffet;
 
// On initialise le sprite comme étant actif
Active = true;
 
// Points de santé de l'astronef au départ
health = 100;
 
//Vitesse de l'astronef en déplacement
speed = 4.0f;
}
#endregion Fonction d'initialisation
 
 
#region Fonction de mise à jour
// Mise à jour de l'animation
public void Update(GameTime gameTime)
{
HeroAnimation.Position = Position;
//HeroAnimation.spriteEffet = SpriteEffet;
HeroAnimation.Update(gameTime);
}
#endregion Fonction de mise à jour
 
 
#region Fonction de dessin
// Dessine l'animation
public void Draw(SpriteBatch spriteBatch)
{
HeroAnimation.Draw(spriteBatch);
}
#endregion Fonction de dessin
 
}
}

 

   Comme je l'ai indiqué dans les deux précédents chapitres, ce code peut se passer de commentaires (voyez le chapitre 16 pour plus d'information wink).
   Je conseille cependant à 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. smiley

 

   Je voudrais néanmoins apporter quelques explications sur le fait que je mets tout ce qui est en rapport avec un effet sur le sprite en commentaires :
//public SpriteEffects SpriteEffet;
//this.SpriteEffet = spriteEffet;
//HeroAnimation.spriteEffet = SpriteEffet;

 

   En effet, je voudrais que l'astronef soit toujours en position de regarder vers la gauche et ce, quelle que soit la touche pressée. Je fais ceci dans un souci d'efficacité lors de prochains combats afin que l'astronef se présente toujours face à l'ennemi. wink Cependant, dans le cas où un futur Boss serait ajouté plus tard dans le jeu, je serais sans doute amené à revoir ma position et c'est pourquoi je garde le code en commentaires dans la classe. cheeky

   Ceux d'entre-vous qui voudraient absolument que l'astronef fasse un demi-tour vers la droite quand la flèche droite est pressée, pourriez à ce niveau, et si vous avez suivi tous les tutoriels depuis le début, faire la modification vous-mêmes, sinon les bouts de code à transformer sont prêts à vous être livrés dès que vous passerez par le forum (Après tout, les forums sont destinés à établir des questions-réponses, je pense... wink).

   Ceci étant dit, nous pouvons maintenant compléter le code de notre fichier AronAndTheAliens08.cs.


     2 – Fichier «AronAndTheAliens08.cs» 

   On retourne maintenant dans notre fichier AronAndTheAliens08.cs. Avant toute chose, n'oubliez pas de mettre le fichier fusee.png dans le dossier Textures de votre projet si ce n'est déjà fait (vous le trouverez au début de ce chapitre ou dans l'archive téléchargeable wink).

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

 

#region HERO DECLARATIONS DATAS'S
 
Texture2D astronautTexture; //Texture feuille de sprites astronaute
Vector2 heroPosition; //Position du joueur
 
#endregion HERO DECLARATIONS DATA'S

 

   Région dans laquelle nous ajoutons des déclarations de variables concernant notre héros.

 

     Fonction Initalize()

  Complétons cette fonction. A l'intérieur de la région INITIALIZE ANIMATIONS DATA'S : 

 

En -dessous de :
spaceforce = new List<SpaceForce>();
Ajoutez :
//Instanciation de la classe HERO
hero = new Hero();    
 
En -dessous de :
spaceForceSpawnTime = TimeSpan.FromSeconds(6.0);
Ajoutez :
//position initiale de l'astronef
heroPosition.X = (graphics.PreferredBackBufferWidth) - 80;
heroPosition.Y = (graphics.PreferredBackBufferHeight / 2 + 100);

 

   Ici nous ajoutons la position initiale de l'astronef au lancement du jeu, c'est à dire un peu plus bas que la position de la planète Terre, graphics.PreferredBackBufferWidth et graphics.PreferredBackBufferHeight représentant bien entendu les largeur et hauteur de notre fenêtre de jeu. wink

   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 :
spaceForceTexture = Content.Load<Texture2D>("Textures/fuseeVerte");
Ajoutez :
astronautTexture = Content.Load<Texture2D>("Textures/fusee");

 

   Et dans notre fonction LoadContent(), nous allons ajouter une région qui représente les animations de notre héros. Donc, toujours à l'intérieur de la région FUNCTION LOADCONTENT, à la suite de la région FONTS, entrez le code suivant :

 

#region HERO ANIMATIONS
 
Animation heroAnimation = new Animation();
heroAnimation.Initialize(astronautTexture, Vector2.Zero, 80, 55, 4, 15,
Color.White, 1.0f, true);
hero.Initialize(heroAnimation, heroPosition);
 
#endregion HERO ANIMATIONS

 

   Région dans laquelle nous créons une instanciation de notre animation et que nous initialisons comme nous l'avons vu dans les chapitres précédents avec les données du sprite.

   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 (je vous rappelle que les valeurs 80, 55, 4, et 15 représentent respectivement les largeur, hauteur, nb frames et le nb de ms/frame de la feuille de sprite fusee.png wink).

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

 

     Mise à jour (Update)

   Nous allons maintenant écrire la fonction de mise à jour de notre héros. Donc, à la suite de la région SPACE FORCE UPDATE LIST FUNCTION, entrez la région suivante : 

 
#region HERO UPDATE FUNCTION
private void UpdateHero(GameTime gameTime)
{
hero.Update(gameTime);
 
// Contrôles Keyboard/Dpad
// Déplacement vers le haut
if (currentKeyboardState.IsKeyDown(Keys.Up) ||
currentGamePadState.DPad.Up == ButtonState.Pressed
|| currentGamePadState.ThumbSticks.Left.Y > 0.5f)
{
hero.Position.Y -= hero.speed;
}
 
 
// Déplacement vers le bas
if (currentKeyboardState.IsKeyDown(Keys.Down) ||
currentGamePadState.DPad.Down == ButtonState.Pressed
|| currentGamePadState.ThumbSticks.Left.Y < -0.5f)
{
hero.Position.Y += hero.speed;
}
 
 
// Déplacement vers la gauche
if (currentKeyboardState.IsKeyDown(Keys.Left) ||
currentGamePadState.DPad.Left == ButtonState.Pressed
|| currentGamePadState.ThumbSticks.Left.X < -0.5f)
{
hero.Position.X -= hero.speed;
}
 
// Déplacement vers la droite
if (currentKeyboardState.IsKeyDown(Keys.Right) ||
currentGamePadState.DPad.Right == ButtonState.Pressed
|| currentGamePadState.ThumbSticks.Left.X > 0.5f)
{
hero.Position.X += hero.speed;
}
 
//On vérifie que l'astronef ne puisse dépasser la fenêtre de jeu
hero.Position.X = MathHelper.Clamp(hero.Position.X, 0 + hero.frameWidth / 2,
GraphicsDevice.Viewport.Width -
hero.frameWidth / 2);
 
hero.Position.Y = MathHelper.Clamp(hero.Position.Y, 0 + hero.frameHeight / 2,
GraphicsDevice.Viewport.Height -
hero.frameHeight / 2);
 
}
#endregion HERO UPDATE FUNCTION

 

   Dans la fonction UpdateHero(), comme vous vous en apercevez, nous gérons les déplacements de l'astronef à l'aide des touches flèchées du clavier numérique ou des axes X et Y du thumbpad gauche ou encore du D-Pad de la manette Xbox 360.
   Les déplacements possibles sont HAUT, BAS, GAUCHE, DROITE ainsi que DIAGONALE si l'on presse deux flèches en même temps.

   La position de l'astronef est donc incrémentée ou décrémentée d'une valeur égale à la vitesse donnée par hero.speed selon que celui-ci se déplace dans l'une ou l'autre direction des axes horizontaux et verticaux de notre fenêtre.

   Pour terminer, comme nous l'avons vu dans le programme DriveIn du chapitre 5, nous testons la gestion des collisions sur les côtés gauche et droit de notre fenêtre grâce à une fonction de la classe MathHelper qui nous est fournie par Xna mais en incluant dans notre code, cette fois-ci, les côtés haut et bas de notre fenêtre.

   Et nous pouvons maintenant passer à la modification de la fonction Update() du fichier AronAndTheAlien08.cs.

   Dans la fonction Update(), modifiez : 

 

En -dessous de :
patroller.UpdatePatroller();
Ajoutez :
//Mise à jour du héro
UpdateHero(gameTime);

 

   C'est tout pour notre fonction Update(), il nous reste à compléter la fonction Draw().

 

     Fonction Draw()

   Et dans la fonction Draw(), nous allons dessiner notre héros dans son astronef. Nous devons écrire le code le plus près possible du dessin des aliens mais avant celui de la patrouille MSF donc : 

 

En -dessous de :
for (int i = 0; i < enemies.Count; i++)
{
enemies[i].Draw(spriteBatch);
}
Ajoutez :
//Dessine le héros
hero.Draw(spriteBatch);

 

   Et c'est tout en ce qui concerne notre fonction de dessin. Si vous compilez le programme maintenant, vous pourrez déplacer l'astronef dans toutes les directions. Notez cependant qu'à ce stade de notre tutoriel, aucune collision n'est encore détectée mais PATIENCE ! wink
   Les hostilités ne tarderont plus longtemps. cool

   En attendant, je vous livre un screenshot de notre ami Aron dans l'enfer de la galaxie... 

    Dans le chapitre 19, nous allons ajouter des éléments très importants pour la survie de l'astronef. Il s'agit bien entendu des Power-ups, sans lesquels notre aventure spatiale prendrait très vite une tournure catastrophique cheeky!

    A bientôt pour le chapitre 19 (Ajoutons des Power-ups).

           Gondulzak.

 

 

 

Connexion

CoalaWeb Traffic

Today191
Yesterday282
This week985
This month3278
Total1742485

19/04/24