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 23 : Les collisions (3ème partie) !

 

Tutoriel présenté par : Robert Gillard (Gondulzak)
Date d'écriture : 11 octobre 2014

Dernière mise à jour : 22 novembre 2015

 

      Préliminaires

   Ce chapitre sera certainement le plus important de cette série de tutoriels, mais il vous permettra de comprendre le système de combat entre les forces en présence, donc tenez bon, nous arriverons bientôt au terme de nos efforts ! wink

   Dans notre précédent chapitre, nous avons implémenté nos premières collisions engendrant des explosions avec un générateur de particules (Aliens / Astéroïdes et Astronef / Aliens).

  Dans ce chapitre, nous allons passer aux choses sérieuses au niveau des collisions. Nous allons en effet pouvoir lancer nos fireballs vers les aliens et ceux-ci nous enverront leurs missiles dès que l'astronef se trouvera en ligne de mire. surprise

   Mais nous allons faire plus ! indecision Depuis un petit moment, vous savez que l'astronef peut s'emparer soit de power-ups de santé (tonneaux verts) soit de power-ups d'énergie (tonneaux gris). Et bien, afin de donner un peu plus de challenge au joueur et l'obliger à réfléchir quelque peu dans ce jeu de shoot, la prise de l'un ou l'autre power-up aura des conséquences différentes :
- La prise d'un tonneau d'énergie (gris) qui sera souvent nécessaire, donnera par la même occasion des super missiles à l'ennemi quatre fois plus puissants que de simples missiles. (Je sais, c'est méchant mais le but sera de les éviter... devil)
- En contrepartie, la prise d'un tonneau de santé (vert) donnera des super fireballs à l'astronef, super fireballs qui pourront soit :
- détruire un ennemi d'un seul coup (là je redeviens plus gentil... laugh)
- soit pulvériser un astéroïde en 8 coups (ce dernier point sera implémenté dans le chapitre 24, où vous serez obligés de faire du slalom entre les astéroïdes pour éviter de vous faire exploser!).

   Dans ce chapitre, nous allons donc implémenter deux nouvelles classes, les classes «Fireballs» et «Missils». Nous commencerons en premier par la classe «Fireballs».

 

Le projet « AronAndTheAliens13 »

 

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

 

 

     1 – Classe Fireballs : Le code

     Nous allons maintenant créer une nouvelle classe, la classe «Fireballs». Remplacez le code existant par le code suivant :

 
#region Description
//MERUVIA XNA TUTORIALS
//Jeu : Aron and the Aliens
//AronAndTheAliens13
//Les collisions (partie III)
//Collisions Fireballs / Aliens et Missils / Astronef
//Fichier : Fireballs.cs
//Last update : 08/10/2014
#endregion
 
 
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
 
namespace AronAndTheAliens13
{
class Fireballs
{
#region Déclarations des variables de la classe Fireballs
// Image représentant le fireball
public Texture2D fireballTexture;
 
// Position du fireball relatif au coin supérieur gauche de l'écran
public Vector2 Position;
 
// Etat du fireball
public bool Active;
 
// Booleen de type de fireball
public bool isSuperFireball;
 
// Dommage que peut infliger le fireball à un ennemi
public int Damage;
 
// Dommage que peut infliger le superfireball à un ennemi ou à un astéroïde
public int superDamage;
 
// Vitesse du fireball
 
float fireballMoveSpeed;
#endregion
 
 
#region Accesseurs
 
// Retourne la largeur du fireball
public int frameWidth
{
get { return fireballTexture.Width; }
}
 
 
// Retourne la hauteur du fireball
public int frameHeight
{
get { return fireballTexture.Height; }
}
#endregion
 
 
#region Fonction d'initialisation
public void Initialize(Texture2D texture, Vector2 position)
{
this.fireballTexture = texture;
this.Position = position;
 
// Actif au départ du jeu
Active = true;
 
// Quantité de dommages causés par un fireball à l'ennemi
// Les PV d'un ennemi étant de 12, 3 fireballs détruisent un ennemi
Damage = 4;
superDamage = 100;
 
// Vitesse d'un fireball
fireballMoveSpeed = 5.0f;
 
// Au début, l'astronef tire de simples fireballs
isSuperFireball = false;
 
}
#endregion
 
 
#region Fonction de mise à jour
public void Update()
{
// Un fireball se déplace toujours de la droite vers la gauche
Position.X -= fireballMoveSpeed;
 
// On désactive le fireball s'il sort de l'écran
if (Position.X + fireballTexture.Width < 0)
Active = false;
}
#endregion
 
 
#region Fonction de dessin
public void Draw(SpriteBatch spriteBatch)
{
spriteBatch.Draw(fireballTexture, Position, null, Color.White, 0f,
new Vector2(frameWidth / 2, (frameHeight / 2) - 10), 1f,
SpriteEffects.None, 0f);
}
#endregion
}
}

 

   Pour cette classe, déjà très bien commentée, nous allons nous permettre de n'apporter que quelques éclaircissements là où ils s'imposent le plus. wink

   Nous déclarons un booléen isSuperFireball qui nous permettra de savoir si l'astronef se trouve en possession de simples fireballs ou de super fireballs. Les dommages que l'un et l'autre vont pouvoir causer seront initialisés dans les variables entières Damage et superDamage.

   Et dans la fonction Initialize(), vous voyez que ces dommages seront tout-à-fait différents par rapport aux tirs d'une fireball ou d'une super fireball. Je rappelle encore une fois qu'outre des dommages bien plus puissants vis-à-vis des sorcières aliens, les dommages causés par les super fireballs pourront, dès le prochain tutoriel, exploser également des astéroïdes se présentant sur leur chemin ce qui procurera au joueur le double de points de PO et de score que par l'élimination des aliens. angelheart

   Et c'est tout pour la classe «Fireballs», la fonction Draw() ne présentant aucune difficulté.

   Nous allons maintenant compléter notre fichier AronAndTheAliens13.cs.


   2 – Fichier AronAndTheAliens13.cs

  Dans notre classe «AronAnTheAliens13», dans la région CLASSES REFERENCES, en dessous de la ligne :

 
En-dessous de :
Explosions explosion;
Ajoutez :
Fireballs bullets;

 

   Et en dessous de la région HERO DECLARATIONS DATAS'S, entrez la région suivante :

 
#region FIREBALL DECLARATIONS DATA'S
 
Texture2D fireballTexture;
Texture2D superFireballTexture;
List<Fireballs> fireballs;
// Fréquence à laquelle l'astronef tire un fireball
TimeSpan fireballTime;
TimeSpan previousFireballTime;
 
#endregion FIREBALL DECLARATIONS DATA'S

 

   Dans la région HITBOX COLLISIONS DECLARATIONS, en dessous de la ligne :

 
En-dessous de :
Rectangle asteroidBox; //hitbox asteroïde
Ajoutez :
Rectangle fireballBox; //hitbox fireball astronef

 

   Maintenant, dans la fonction Initialize(), en dessous de la ligne :

 
En-dessous de :
barrels = new List<Barrels>();
Ajoutez :
//Création d'une liste de Fireballs
fireballs = new List<Fireballs>();
 
//Création d'une instance de Fireball
bullets = new Fireballs();
 
En-dessous de :
barrelSpawnTime = TimeSpan.FromSeconds(25.0f);
Ajoutez :
// Un fireball est tiré un peu plus de 3 fois par seconde
fireballTime = TimeSpan.FromSeconds(0.4f);
 
En-dessous de :
isEnergyBarrel = false;
Ajoutez :
//L'astronef ne tire pas de super fireballs au début
bullets.isSuperFireball = false;

 

   Et voilà, c'est tout en ce qui concerne notre fonction Initialize()wink

   On passe maintenant à la fonction LoadContent(). Dans la région TEXTURES, à la suite de :

 
En-dessous de :
onEarthTexture = Content.Load<Texture2D>("Textures/OnEarth");
Ajoutez :
fireballTexture = Content.Load<Texture2D>("Textures/Fireball");
superFireballTexture = Content.Load<Texture2D>("Textures/SuperFireball");

 

   On continue, en dessous de la région ADD EXPLOSION FUNCTION, entrez les deux régions suivantes :

 
#region ADD FIREBALL TO LIST
private void AddFireball(Vector2 position)
{
Fireballs fireball = new Fireballs();
if (bullets.isSuperFireball)
fireball.Initialize(superFireballTexture, position);
else
fireball.Initialize(fireballTexture, position);
fireballs.Add(fireball);
}
#endregion ADD FIREBALL TO LIST
 
 
 
#region UPDATE FIREBALL FUNCTION
private void UpdateFireballs()
{
// Mise à jour des fireballs
for (int i = fireballs.Count - 1; i >= 0; i--)
{
fireballs[i].Update();
 
if (fireballs[i].Active == false)
{
fireballs.RemoveAt(i);
}
}
}
#endregion UPDATE FIREBALL FUNCTION

 

   Dans la première de ces deux régions, nous faisons un test sur bullets.isSuperFireball. Si celui-ci est true, la texture de la super fireball sera utilisée sinon c'est celle du simple fireball qui sera initialisée. wink
   Ensuite, indépendamment du type de texture, on ajoute une fireball à la liste des fireballs, celle-ci gérant les deux types dans la même liste.

   Dans notre seconde région nous écrivons la fonction de mise à jour de la liste des fireballs.

   Nous allons maintenant écrire le code des collisions fireballs / ennemis.


     3 – Collisions Fireball / Enemy

   Dans la région COLLISIONS UPDATE, à la suite de la sous-région COLLISION ASTRONEF / ENEMY, entrez la sous-région suivante :

 
#region COLLISIONS FIREBALL / ENEMY
// Collisions Fireball - Ennemi
for (int i = 0; i < fireballs.Count; i++)
{
for (int j = 0; j < enemies.Count; j++)
{
// Creation des hitboxes pour déterminer une collision fireball / ennemi
fireballBox = new Rectangle((int)fireballs[i].Position.X -
fireballs[i].frameWidth / 2, (int)fireballs[i].Position.Y -
fireballs[i].frameHeight / 2, fireballs[i].frameWidth,
fireballs[i].frameHeight);
 
enemyBox = new Rectangle((int)enemies[j].Position.X -
enemies[j].frameWidth / 2,
(int)enemies[j].Position.Y - enemies[j].frameHeight / 2,
enemies[j].frameWidth, enemies[j].frameHeight);
 
// Determine si un ennemi est entré en collision avec un fireball
if (enemyBox.Intersects(fireballBox))
{
if (bullets.isSuperFireball)
enemies[j].Health -= fireballs[i].superDamage;
else
enemies[j].Health -= fireballs[i].Damage;
 
// Si un ennemi est tué
if (enemies[j].Health <= 0)
{
// Le score du joueur augmente d'une unité
hero.score += enemies[j].score;
 
// Et s'empare du montant possédé par l'ennemi
hero.gold += enemies[j].gold;
}
fireballs[i].Active = false;
}
}
}
#endregion COLLISIONS FIREBALL / ENEMY

 

   Après avoir créé nos hitboxes afin de déterminer nos aires de collisions, on teste si une fireball est entrée en collision avec un ennemi. Si c'est le cas, on regarde de nouveau s'il s'agit d'une super fireball ou non, auquel cas un super dommage ou un dommage normal sera retiré des points de santé de l'ennemi. cheeky

   La mort d'un ennemi entraînera l'augmentation du score du joueur de 50 pts (voir classe Enemy) et l'augmentation d'une quantité de 25 PO dans l'escarcelle du joueur. angel (voir également la classe Enemy).

   Mais n'oublions pas que l'astronef ne tire pas seul sur l'ennemi. En effet, le joueur a besoin de presser sur une touche ou sur un bouton afin de déclencher les tirs, et à cet effet nous allons devoir compléter notre fonction UpdateHero(). Et en-dessous du test de pression des touches flèche et bouton X de la fonction UpdateHero(), ajoutez les lignes suivantes :

 
// La touche SPACE du clavier ou le bouton X du gamepad
//servent au joueur pour tirer sur l'ennemi
if (currentKeyboardState.IsKeyDown(Keys.Space) ||
(currentGamePadState.Buttons.X == ButtonState.Pressed))
{
// Ne tire que dans l'intervalle de temps fixé
if (gameTime.TotalGameTime - previousFireballTime > fireballTime)
{
// Réinitialisation du temps
previousFireballTime = gameTime.TotalGameTime;
 
// On ajoute le projectile avec une origine réaliste par rapport à
// l'astronef
AddFireball(hero.Position - new Vector2(hero.frameWidth / 2, 0));
 
}
}

 

   Voilà, le code est documenté et ne présente aucune difficulté. Nous presserons la touche «Espace» du clavier ou le bouton «X» du gamepad pour déclencher nos tirs. wink

   Il nous reste à mettre à jour les fonctions Update() et Draw(). Et dans la fonction Update(), à la suite de :

 

En-dessous de :
satellite.UpdateSatellite();
Ajoutez :
//Mise à jour des Fireballs
UpdateFireballs();

 

   Ensuite, dans la fonction Draw(), à l'intérieur de la région Dessin des différentes animations, en dessous des lignes qui dessinent les ennemis, entrez les lignes suivantes :

 

// Dessine les Fireballs
for (int i = 0; i < fireballs.Count; i++)
{
fireballs[i].Draw(spriteBatch);
}

 

   Voilà, nous avons déjà bien travaillé et nous pouvons maintenant exploser quelques vilaines sorcières avec nos fireballs ! indecision Mais je ne pense pas qu'elles vont rester sans réagir, non... frown Ne pensez pas vous en tirer à si bon compte... laugh Nous allons donc maintenant leur permettre de riposter en écrivant le code de la classe «Missils»


   4 – La Classe Missils : le code

 

#region Description
//MERUVIA XNA TUTORIALS
//Jeu : Aron and the Aliens
//AronAndTheAliens13
//Les collisions (partie III)
//Collisions Fireballs / Aliens et Missils / Astronef
//Fichier : Missils.cs
//Last update : 08/10/2014
#endregion
 
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
 
 
namespace AronAndTheAliens13
{
class Missils
{
#region Déclaration des variables de la classe Missils
// Largeur de l'écran de jeu
public int gameWidth;
 
// La texture qui représente le missile
public Texture2D missilTexture;
 
// Position du missile par rapport au coin supérieur gauche de l'écran
public Vector2 Position;
 
// Etat du missile
public bool Active;
 
// Booléen de type de missile
public bool isSuperMissil;
 
// Dommages causés par le missile au joueur
public int Damage;
 
// Dommages causés par un super missile au joueur
public int superDamage;
 
// Vitesse du missile
float missilMoveSpeed;
#endregion
 
 
#region Accesseurs
// Retourne la largeur du missile
public int frameWidth
{
get { return missilTexture.Width; }
}
 
 
// Retourne la hauteur du missile
public int frameHeight
{
get { return missilTexture.Height; }
}
#endregion
 
 
#region Fonction d'initialisation
public void Initialize(Texture2D texture, Vector2 position)
{
this.missilTexture = texture;
this.Position = position;
 
// Actif en début de jeu
Active = true;
 
// dommages causées par le missile à l'astronef
Damage = 5;
 
// dommages causées par un super missile
superDamage = 20;
 
// Largeur de l'écran de jeu
gameWidth = 800;
 
// Pas de super missiles au départ
isSuperMissil = false;
 
// Vitesse d'un missile
missilMoveSpeed = 20.0f;
}
#endregion
 
 
#region Fonction de mise à jour
public void Update()
{
// Un missile se déplace toujours vers la droite
Position.X += missilMoveSpeed;
 
// On désactive le fireball s'il sort de l'écran
if (Position.X > gameWidth + frameWidth)
Active = false;
}
#endregion
 
 
#region Fonction de dessin
public void Draw(SpriteBatch spriteBatch)
{
spriteBatch.Draw(missilTexture, Position, null, Color.White, 0f,
new Vector2((frameWidth / 2) + 5, (frameHeight / 2) + 2), 1f,
SpriteEffects.None, 0f);
}
#endregion
}
}

 

   Cette classe est aussi largement commentée que la classe «Fireballs», nous n'ajouterons donc que le strict nécessaire. wink

   Nous déclarons un booléen isSuperMissil qui nous permettra de savoir si un ennemi se trouve en possession de simples missiles ou de super missiles. Les dommages que l'un et l'autre vont pouvoir causer seront initialisés dans les variables entières Damage et superDamage.

   Et dans la fonction Initialize(), vous voyez que ces dommages seront tout-à-fait différents par rapport aux tirs d'un missile ou d'un super missile. Je rappelle encore une fois que pour cause de dommages bien plus puissants vis-à-vis de l'astronef, les dommages causés par les super missiles pourront exploser l'astronef en quelques coups, ce qui provoquera l'élimination immédiate de celui-ci. surprise

   Et c'est tout pour la classe «Missils», la fonction Draw() ne présentant aucune difficulté.

   Mais nous devons à nouveau compléter notre fichier AronAndTheAliens13.cs !

 

     5– Retour dans AronAndTheAliens13.cs

   Dans notre classe «AronAnTheAliens13», dans la région CLASSES REFERENCES, en dessous de la ligne : 

 

En-dessous de :
Fireballs bullets;
Ajoutez :
Missils missiles;

 

   Et en dessous de la région FIREBALL DECLARATIONS DATA'S, entrez la région suivante : 

 

#region MISSIL DECLARATIONS DATA'S
Texture2D missilTexture;
Texture2D superMissilTexture;
List<Missils> missils;
// Fréquence à laquelle un alien tire un missile
TimeSpan missilsFireTime;
TimeSpan previousMissilsFireTime;
#endregion MISSIL DECLARATIONS DATA'S

 

   Dans la région HITBOX COLLISIONS DECLARATIONS, en dessous de la ligne :

 
En-dessous de :
Rectangle fireballBox; //hitbox fireball astronef
Ajoutez :
Rectangle missilBox; //hitbox pour un missile de l'ennemi

 

   Maintenant, dans la fonction Initialize(), en dessous de la ligne :

 
En-dessous de :
bullets = new Fireballs();
Ajoutez :
//Création d'une liste de missiles
missils = new List<Missils>();
 
//Création d'une instance de Missils
missiles = new Missils();
 
En-dessous de :
fireballTime = TimeSpan.FromSeconds(0.4f)
Ajoutez :
// Un missile est tiré un peu plus de chaque 1/2 seconde
missilsFireTime = TimeSpan.FromSeconds(0.65f);

 

En-dessous de :
bullets.isSuperFireball = false;
Ajoutez :
//Un alien ne tire pas de super missiles au départ
missiles.isSuperMissil = false;

 

   Et voilà, c'est tout en ce qui concerne notre fonction Initialize().

   On passe maintenant à la fonction LoadContent(). Dans la région TEXTURES, à la suite de :

 

En-dessous de :
superFireballTexture = Content.Load<Texture2D>("Textures/SuperFireball");
Ajoutez :
missilTexture = Content.Load<Texture2D>("Textures/EnemyMissile");
superMissilTexture = Content.Load<Texture2D>("Textures/EnemySuperMissile");

 

   Nous allons maintenant ajouter les missiles nouvellement créés à la liste active des missiles et en faire la mise à jour. Donc, en dessous de la région UPDATE FIREBALL FUNCTION, entrez les deux régions suivantes : 

 
#region ADD MISSIL TO LIST
private void AddMissil(Vector2 position)
{
Missils missil = new Missils();
 
if (missiles.isSuperMissil == true)
missil.Initialize(superMissilTexture, position);
else
missil.Initialize(missilTexture, position);
 
missils.Add(missil);
}
#endregion ADD MISSIL TO LIST
 
 
#region UPDATE MISSIL FUNCTION
private void UpdateMissils(GameTime gameTime)
{
// Mise à jour des missiles
for (int i = missils.Count - 1; i >= 0; i--)
{
missils[i].Update();
 
if (missils[i].Active == false)
{
// Ajout d'une animation explosion
AddExplosion(missils[i].Position, gameTime);
missils.RemoveAt(i);
}
}
}
#endregion UPDATE MISSIL FUNCTION

   Ces fonctions étant similaires à leurs «jumelles» sur les fireballs, nous nous passerons de commentaires inutiles. wink

   Et nous allons maintenant écrire le code des collisions astronef / missils.


    6 – Collisions Astronef / Missils

      Dans la région COLLISIONS UPDATE, à la suite de la sous-région COLLISIONS FIREBALL / ENEMY, entrez la sous-région suivante :

 
#region COLLISIONS ASTRONEF / MISSILS
// Collisions astronef - missiles
for (int j = 0; j < enemies.Count; j++)
{
for (int i = 0; i < missils.Count; i++)
{
missilBox = new Rectangle((int)missils[i].Position.X,
(int)missils[i].Position.Y,
missils[i].frameWidth,
missils[i].frameHeight);
 
// Determine si l'astronef est entré en collision avec un missile
if (astronefBox.Intersects(missilBox))
{
//si c'est un supermissile :
if (missiles.isSuperMissil == true)
{
hero.getDamage = missils[i].superDamage;
hero.Position.X += 5;
}
else
//Sinon c'est un missile ordinaire
hero.getDamage = missils[i].Damage;
 
// Si le nombre de points de bouclier est > 0
if (hero.shield > 0)
//Si les dommages reçus sont < aux points de bouclier
if (hero.getDamage < hero.shield)
hero.shield -= hero.getDamage;
else
{
//Si les dommages reçus sont > aux points de bouclier
//le reste sera retiré sur la santé
hero.otherDamage = hero.getDamage - hero.shield;
hero.shield = 0;
hero.health -= hero.otherDamage;
}
else
//Sinon si le nombre de points de bouclier = 0
//tous les dommages sont retirés à la santé
hero.health -= hero.getDamage;
 
// Si le missile est entré en collision avec l'astronef,
// le missile est détruit
missils[i].Active = false;
 
// Si les PV de l'astronef sont <= 0, fin de partie !
if (hero.health <= 0)
{
hero.killedByAlien = true;
hero.noMoreEnergy = false;
hero.Active = false;
hero.onCombatWindow = false;
}
 
}
 
}
}
#endregion COLLISIONS ASTRONEF / MISSILS

 

   Les commentaires de ces collisions sont similaires à ceux des collisions fireballs / ennemis. Nous pouvons juste retenir qu'un simple missile causera 5 pts de dommages à l'astronef tandis qu'un super missile lui en causera 20.

   Bien, penchons-nous maintenant sur une ou deux choses importantes à ne pas oublier :

   Les fireballs sont tirées par le joueur en pressant la touche «Space» du clavier ou le bouton «X» du gamepad, nous l'avons vu. Pour ce qui est des missiles, ceux-ci seront envoyés par les ennemis dès que l'astronef entrera en ligne de mire. Il nous faut donc dire à nos sorcières «Si vous voyez l'astronef, tirez-lui dessus...» devil, mais où allons-nous faire ceci ? surprise  Eh bien, dans la fonction UpdateEnemies(), cela va de soit. wink

   Donc dans la région ENEMIES UPDATE LIST FUNCTION, juste en dessous de :

 
En-dessous de :
enemies[i].Update(gameTime);
Ajoutez :
// Ne tire que dans l'intervalle de temps accordé
if (gameTime.TotalGameTime - previousMissilsFireTime > missilsFireTime)
{
//Réinitialisation du temps
previousMissilsFireTime = gameTime.TotalGameTime;
 
//Ajout d'un missile, mais qui ne sera tiré qu'en face de l'astronef
if (((int)enemies[i].Position.Y - enemies[i].frameHeight / 2 <
(int)hero.Position.Y) &&
((int)enemies[i].Position.Y + enemies[i].frameHeight + 25 >
(int)hero.Position.Y + hero.frameHeight))
{
AddMissil(enemies[i].Position +
new Vector2(enemies[i].frameWidth - 50,
enemies[i].frameHeight / 3));
}
}

 

   D'autre part, nous devons éviter que l'astronef, qui était en possession de super fireballs lors d'un crash quelconque, en soit toujours doté après avoir pressé la touche «Enter» pour recommencer une partie. De même, si les aliens sont en possession de super missiles lors du crash de l'astronef, ils ne peuvent plus les posséder lors d'une nouvelle partie. indecision

   Pour remédier à ceci, nous allons nous rendre dans la région RESET VARIABLES TO START AGAIN.

   Et dans cette région, à la suite des instructions de la fonction ResetGame(), ajoutez les lignes suivantes : 

 
bullets.isSuperFireball = false;
missiles.isSuperMissil = false;

 

   Encore une chose, comment allons-nous savoir si l'astronef s'est bien emparé d'une super fireball ou si les aliens ont acquis des super missiles ? frown  Eh bien, en s'emparant des différents power-ups, me direz-vous... cheeky Oui, mais nous devons le signaler quelque part, et nous nous rendons de ce pas dans la région COLLISION ASTRONEF / POWER_UPS.

   Et dans cette région, à l'intérieur du test if (isEnergyBarrel == false), en dessous de la ligne :

 
En-dessous de :
hero.gold -= 200;
Ajoutez :
bullets.isSuperFireball = true;
missiles.isSuperMissil = false;

 

   De même, à l'intérieur du test else if (isEnergyBarrel == true), en dessous de la ligne :
 
En-dessous de :
hero.gold -= 200;
Ajoutez :
bullets.isSuperFireball = false;
missiles.isSuperMissil = true;

 

   Et voilà, il nous reste à mettre à jour les fonctions Update() et Draw(). Et dans la fonction Update(), à la suite de :
 
En-dessous de :
UpdateFireballs();
Ajoutez :
// Mise à jour des missiles
UpdateMissils(gameTime);

 

  Ensuite, dans la fonction Draw(), à l'intérieur de la région Dessin des différentes animations, en dessous des lignes qui dessinent les fireballs, entrez les lignes suivantes :

 

// Dessine les Missiles
for (int i = 0; i < missils.Count; i++)
{
missils[i].Draw(spriteBatch);
}

 

   Et nous voici enfin arrivés au bout de ce chapitre, pffft... cheeky Oui je sais, ce fut long, mais le résultat en est très satisfaisant wink, maintenant vous pouvez déjà en découdre avec les sorcières aliens, tout en évitant de vous faire descendre cool, acheter des power-ups et essayer de rejoindre la Terre vivant pour recharger les boucliers... angel C'est déjà très bien mais d'autres challenges vous attendent ! cheeky Dans le prochain chapitre sur les collisions astronef / astéroïdes et super fireballs / astéroïdes, vous devrez en plus faire du slalom entre les astéroïdes afin de ne pas vous faire exploser ! surprise mais en contre-partie, vos super fireballs pourront les pulvériser en doublant vos PO et votre score ! angel

   Nous procéderons également à une petite modification sur la fréquence de tir des fireballs de l'astronef, selon que ceux-ci sont des super fireballs ou de simples fireballs et de même en ce qui concerne les missiles ou super missiles de l'ennemi. wink

   Pour terminer, nous implémenterons les collisions Satellite / ennemis, ou plutôt les collisions satellite / missiles car nos sorcières vicieuses tâcheront d'exploser nos satellites afin que ceux-ci ne puissent plus nous renseigner sur la position des planètes et en particulier de la position de la Terre par rapport à la fenêtre de combat ! indecision

   Que de joie en perspective ! wink

   Et voici un screenshot tiré d'une phase de combat. (Joli, le générateur de particules de Jay... cool

 L'astronef a été touché par un missile...

   A bientôt pour le chapitre 24 (Les Collisions partie IV – Collisions astronef / astéroïdes - super fireballs / astéroïdes et satellite / missiles ennemis ) ! smiley

         Gondulzak.

 

 

 

Connexion

CoalaWeb Traffic

Today297
Yesterday178
This week797
This month4471
Total1743678

25/04/24