07/05/2023 : Malheureusement, suite à un manque de financement et à des échéances prochaines impliquant de refaire TOUT le site en l'adaptant à une nouvelle plateforme pour pallier les risques croissants de sécurité, il est pour l'instant prévu que le site ferme prochainement ses portes...
 
13/06/2023 : Finalement, le site a été refinancé pour une nouvelle année complète. En l'état, il est fonctionnel mais notre hébergeur ne nous permet pas une mise à jour vers Joomla 4 ou php 8 (il a été racheté et n'est plus que l'ombre de lui-même...). Cela nous laisse cependant un peu de temps pour trouver une solution.

 

 
 

 

  

 

Space shooter : Aron & The Aliens

Chapitre 19 : Ajoutons des power-ups

 

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

 

      Préliminaires

   Voici notre ami Aron dans l'Espace mais, comme je vous l'ai signalé à la fin du précédent chapitre, nous allons maintenant ajouter des éléments très importants pour la survie de l'astronef. Il s'agit bien entendu des Powers-up, sans lesquels notre aventure spatiale ne pourrait pas se dérouler bien longtemps... crying

 

 

   Ces powers-up, représentés sous la forme de tonneaux (barrel en anglais wink), seront générés aléatoirement à partir de l'axe X de notre fenêtre en position y = 0. Ils vont descendre lentement vers le bas de la fenêtre avec un léger mouvement rotatoire et pendulaire et seront de deux types :

- Tonneaux de couleur verte : régénérateurs de santé ou de boucliers,
- Tonneaux de couleur grise : pourvoyeurs d'énergie pour les déplacements de l'astronef.

   Et à cet effet nous allons écrire une nouvelle classe, la classe «Barrels». wink

 

Plusieurs solutions s'offraient à moi en ce qui concerne les divers types de collisions susceptibles d'être appliqués avec les powers-up. Pour des raisons de gameplay (mais celles-ci pourraient être revues par la suite), j'ai retenu la solution de ne permettre dans un premier temps que la collision tonneaux / astronef. En effet, ces tonneaux n'étant générés dans la fenêtre qu'avec parcimonie, il serait trop désavantageux pour l'astronef que les ennemis puissent également s'en emparer. devil

 

   Mais point de collisions encore dans ce chapitre et nous en reparlerons dans les chapitres concernant celles-ci. En attendant, lançons-nous sans plus tarder dans l'écriture de notre nouvelle classe.  

 

Le projet « AronAndTheAliens09 »

 

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

 

 

     1 – Classe Barrels : Le code

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

 

#region Description
//MERUVIA XNA TUTORIALS
//AronAndTheAliens
//Jeu : Aron and the aliens
//Mise en place des Powers-up
//Barrels.cs
//Last update : 24/08/2014
#endregion
 
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
 
namespace AronAndTheAliens09
{
class Barrels
{
#region Déclaration des variables de la classe Barrels
// Animation qui représente un tonneau
public Animation BarrelAnimation;
 
// Position d'un tonneau relative au coin supérieur gauche de l'écran
public Vector2 Position;
 
// Etat d'un tonneau
public bool Active;
 
// Points de santé ajoutés au joueur si collision.
public int Health;
 
// Unité ajoutée au joueur si prise d'un tonneau d'énergie
public int Unit;
 
// Vitesse de déplacement du tonneau
float barrelMoveSpeed;
 
#endregion Déclaration des variables de la classe Barrels
 
 
 
#region Accesseurs
// Renvoie la largeur d'un tonneau
public int Width
{
get { return BarrelAnimation.FrameWidth; }
}
 
// Renvoie la hauteur d'un tonneau
public int Height
{
get { return BarrelAnimation.FrameHeight; }
}
#endregion Accesseurs
 
 
#region Fonction d'initialisation
public void Initialize(Animation animation, Vector2 position)
{
// Charge la texture des tonneaux
BarrelAnimation = animation;
 
// Initialise la position d'un tonneau
Position = position;
 
// Au début du jeu un déplacement de tonneaux est déclaré Actif
Active = true;
 
// Points de vie d'un tonneau (ajoutés au joueur si collision)
Health = 30;
 
// Si le joueur s'empare d'un tonneau, on incrémente son stock de 1
Unit = 1;
 
// Vitesse de déplacement d'un tonneau
barrelMoveSpeed = 0.2f;
 
}
#endregion Fonction d'initialisation
 
 
#region Fonction de mise à jour
public void Update(GameTime gameTime)
{
// Le déplacement d'un tonneau ne se fait que du haut vers le bas de l'écran
Position.Y += barrelMoveSpeed;
 
// Mise à jour de la position de l'animation
BarrelAnimation.Position = Position;
 
// Mise à jour de l'animation
BarrelAnimation.Update(gameTime);
 
// Si un tonneau sort de l'écran ou si ses points de vie sont <= 0,
// on le désactive
if (Position.Y > 480 + Height / 2 || Health <= 0)
{
// Et en mettant le "drapeau" Active à false, on enlève l'objet tonneau
// de la liste
Active = false;
}
}
#endregion Fonction de mise à jour
 
 
 
#region Fonction de dessin
public void Draw(SpriteBatch spriteBatch)
{
// Dessine l'animation
BarrelAnimation.Draw(spriteBatch);
}
#endregion Fonction de dessin
}
}

 

   Et tout comme les commentaires ajoutés au long du code la de la classe «Asteroids» du chapitre 14, ceux de la classe «Barrels» sont également relativement explicites. wink

 

    Fonction Initialize()

   Dans cette fonction, les points de santé d'un tonneau sont initialisés à 30. Ceci veut simplement dire que la prise d'un tonneau de couleur verte ou lifeBarrel (donc régénérateur de santé heart), ajoutera 30 points de santé aux points de santé déjà acquis par l'astronef. Ceux-ci bien entendu ne pourront ni être supérieurs à 100 ni inférieurs à 0. cheeky

   La vitesse de déplacement (ou de chute) d'un tonneau sera volontairement lente, chaque power-up étant supposé être relativement facile à acquérir pour l'astronef (si besoin en est et si PO en suffisance, bien entendu... wink). Cette vitesse est portée à 0.2f.

   Nous verrons plus tard, lors des collisions barrels / astronef, que la prise d'un tonneau de couleur grise ou energyBarrel, apportera à l'astronef la possibilité d'un déplacement de 1500 unités de ce que j'appellerai Unités de Déplacement Intergalactique et nous verrons à ce moment comment celles-ci seront décomptées de notre réservoir d'énergie. wink

   Et c'est tout ce qu'il faut savoir au sujet de la fonction Initialize(), celle-ci ne présentant aucune difficulté.


   Fonction Update()

   Ici nous voyons que la variable Position de type Vector2 donne la direction du déplacement des powers-up. En effet, comme chaque déplacement ne modifie que la position en Y d'une valeur «barrelMoveSpeed» nous voyons que la direction que prend le power-up va du haut vers le bas de l'écran.

   Suivent ensuite les mises à jour des déplacements et de l'animation des power-ups. Et pour terminer nous devons enlever un power-up de la liste des power-ups dès que celui-ci disparaît de l'écran ou que ses points de santé sont égaux à zéro lors d'une acqusition par l'astronef. Pour ce faire nous faisons un test sur ses points de santé et un autre pour voir si un power-up sort par le bas de l'écran. Dans ce cas, nous mettons le drapeau Active à false pour qu'il soit enlevé de la liste (nous allons le voir bientôt wink) dans la fonction UpdateBarrels() du fichier AronAndTheAliens09.cs.

 

   Fonction Draw()

   Dans la fonction Draw(), nous dessinons simplement l'animation à l'aide de l'instruction :
BarrelAnimation.Draw(spriteBatch);

   Et c'est tout pour la classe «Barrels», nous pouvons maintenant compléter le code de notre fichier AronAndTheAliens09.cs.


     2 – Fichier «AronAndTheAliens09.cs»

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

   Ceci étant dit, en dessous de la région HERO DECLARATIONS DATAS'S, ajoutez les lignes suivantes : 

 

#region POWER_UP DECLARATIONS DATA'S
 
Texture2D barrelTexture;
List<Barrels> barrels;
int barrelColorChoice = 0; //Représentera un choix aléatoire de couleur
Color barrelColor; //Couleur d'un tonneau
 
// La fréquence à laquelle apparait un Power-up
TimeSpan barrelSpawnTime;
TimeSpan previousBarrelSpawnTime;
 
#endregion POWER_UP DECLARATIONS DATA'S

 

   Il s'agit d'une région qui concerne des déclarations de données se rapportant aux power-ups. Rien de spécial dans ces déclarations mis à part une variable entière pour représenter un choix aléatoire entre les deux couleurs de nos tonneaux et une autre de type Color qui représentera soit la couleur verte soit la couleur grise de ceux-ci.

   Dans la fonction Initialize(), à l'intérieur de la région INITIALIZE ANIMATIONS DATA'S, ajoutez :

 
En -dessous de :
hero = new Hero();
Ajoutez :
//Initialise la liste des Power-ups
barrels = new List<Barrels>();

 

En -dessous de :
previousSpaceForceSpawnTime = TimeSpan.Zero;
Ajoutez :
previousBarrelSpawnTime = TimeSpan.Zero;
 
En -dessous de :
spaceForceSpawnTime = TimeSpan.FromSeconds(6.0);
Ajoutez :
//Détermine à quelle fréquence un Power-Up réapparaît
barrelSpawnTime = TimeSpan.FromSeconds(35.0f);

 

   Pour terminer, nous donnons une valeur égale à 35 secondes à la variable barrelSpawnTime, ce qui représente la fréquence d'apparition des powers-up à l'écran. wink

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


   Dans la fonction LoadContent(), en dessous de :

 

En -dessous de :
astronautTexture = Content.Load<Texture2D>("Textures/fusee");
Ajoutez :
barrelTexture = Content.Load<Texture2D>("Textures/Baril_27x32");

 

   Et c'est tout en ce qui concerne la fonction LoadContent(). Nous allons maintenant écrire le code de la fonction AddBarrel(), qui ajoute un power-up à la liste des power-ups.

   Donc, en-dessous de la région HERO UPDATE FUNCTION, entrez la région suivante : 

 

#region ADD POWER_UP TO LIST
private void AddBarrel()
{
// Creation de l'animation d'un objet tonneau
Animation barrelAnimation = new Animation();
 
//Couleur aléatoire du tonneau
barrelColorChoice = rand.Next(1, 3);
 
switch (barrelColorChoice)
{
case 1:
barrelColor = Color.DarkGray; //Power-up Energy barrel (gris)
break;
 
case 2:
barrelColor = Color.LightGreen; //Power-up health/shield barrel (brun)
break;
 
default:
break;
}
 
// 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
barrelAnimation.Initialize(barrelTexture, Vector2.Zero, 27, 32, 17, 175,
barrelColor, 1.0f, true);
Vector2 barrelposition = Vector2.Zero;
barrelposition = randomHorizontalLocation();
 
// Creation d'un Power-up
Barrels barrel = new Barrels();
 
// Initialation d'un Power-up
barrel.Initialize(barrelAnimation, barrelposition);
 
// Ajoute le power-up à la liste active des power-ups
barrels.Add(barrel);
 
}
#endregion ADD POWER_UP TO LIST
 

 

   Cette fonction ne présente pas de difficultés, nous avons vu ce que représentaient les variables barrelColorChoice et barrelColor dans la région des déclarations.
   Après la recherche aléatoire, nous commençons par créer l'animation d'un power-up et ensuite nous initialisons l'animation créée en passant à la fonction Initialize() les paramètres texture, location, largeur, hauteur, nb de frames / feuille, nb de millisecondes/frame, la couleur, l'échelle, et l'état de l'animation.

   Nous faisons ensuite de nouveau appel à la fonction randomHorizontalLocation() que nous avions écrite lors du chapitre sur les astéroïdes. Cette fois-ci, cette fonction va déterminer une position aléatoire d'un power-up sur l'axe X et nous retournerons la valeur générée dans la variable location.
   Et maintenant que nous avons l'animation et la position d'un power-up à afficher à l'écran, nous n'avons plus qu'à créer l'objet lui-même en créant une instance de la classe Barrels et initialiser l'objet en passant son animation ainsi que sa position à la fonction Initialize().

   Et pour terminer, nous ajoutons le power-up à la liste des power-ups à l'aide de l'instruction

barrels.Add(barrel);

 

   Nous devons maintenant mettre à jour la liste des power-ups à l'aide de la fonction UpdateBarrels(), donc à la suite de la fonction AddBarrel() entrez le code suivant :
    

#region POWER_UP UPDATE FUNCTION
private void UpdateBarrels(GameTime gameTime)
{
// Génère un nouveau tonneau toutes les 35 secondes
if (gameTime.TotalGameTime - previousBarrelSpawnTime > barrelSpawnTime)
{
previousBarrelSpawnTime = gameTime.TotalGameTime;
 
// Ajout d'un tonneau
AddBarrel();
}
 
// Mise à jour des tonneaux
for (int i = barrels.Count - 1; i >= 0; i--)
{
barrels[i].Update(gameTime);
 
// Si inactif
if (barrels[i].Active == false)
//On enlève le power-up de la liste
barrels.RemoveAt(i);
}
}
#endregion POWER_UP UPDATE FUNCTION

 

   Cette fonction va dans un premier temps générer un nouveau power-up toutes les 35 secondes et l'ajouter à la liste des powers-up par l'appel à la fonction AddBarrel() que nous venons de voir plus haut. cool

   Nous parcourons ensuite toute la liste des powers-up 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 quelconque de la liste, celui-ci est immédiatement enlevé de cette liste à l'aide de l'instruction :

barrels.RemoveAt(i); 


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

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

   Et dans la fonction Update(), en dessous de :

 
En -dessous de :
UpdateHero(gameTime);
Ajoutez :
//Mise à jour des powers-up
UpdateBarrels(gameTime);

 

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

   Entre le dessin de la liste de nos sorcières aliens et le dessin de notre héros, entrez les lignes suivantes : 

 

// Dessine les powers-up
for (int i = 0; i < barrels.Count; i++)
{
barrels[i].Draw(spriteBatch);
}

 

   Et c'est tout pour ce chapitre. Tous nos objets sont désormais dans la fenêtre, enfin !laugh
   Dans le prochain chapitre nous allons mettre en oeuvre un simple menu et introduire une nouvelle classe, la classe «Scripts». Nous pourrons par la suite nous attaquer à la gestion des collisions de tout ce petit monde afin de bientôt en découdre avec ces horribles sorcières aliens et ceci nous prendra encore quelques chapitres mais en attendant, compilez ce projet et admirez la chute des powers-up dont je vous donne un screenshot ici.  cool

 

 

  A bientôt pour la suite, smiley

         Gondulzak.

 

 

Connexion

CoalaWeb Traffic

Today57
Yesterday282
This week851
This month3144
Total1742351

19/04/24