Créer un mini jeu type Asteroid
Partie 3
Utilisation de la classe Sprite
Nous allons maintenant utiliser cette classe dans notre projet « SpaceGame », je vous invite d’ailleurs à le télécharger si vous ne l’avez pas sous la main. Je vous préviens il va y avoir du changement et pas qu’un petit peu.
Nous utiliserons ici la classe Sprite présentée dans l'article précédent.
Ancien code :
Nous utiliserons ici la classe Sprite présentée dans l'article précédent.
Ancien code :
// Variables relatives au vaisseau Texture2D ship; Vector2 shipPosition; int moveSpeed; // Variables relatives au laser Texture2D laser; Vector2 laserPosition; int laserSpeed; bool shooted; |
Nouveau code :
// Vaisseau Sprite ship; // Laser Sprite laser; |
C’est pas mal du tout car on passe de 8 lignes à seulement 2. La suite est tout aussi bien mais va demander beaucoup plus de changements.
protected override void Initialize() { ship = new Sprite(this); ship.Speed = new Vector2(2, 2); laser = new Sprite(this); laser.Speed = new Vector2(4, 4); base.Initialize(); } |
La méthode Initialize() va nous permettre de créer nos instances de ship et laser. On en profite pour initialiser les vitesses que l’on veut pour le vaisseau et le laser. Comme la vitesse est représentée par une structure de type Vector2 on passe une instance à cette structure à nos 2 objets. Vous noterez que l’on n’utilise pas encore la méthode Initialize de la classe Sprite car ici ce n’est pas nécessaire, cette méthode sera surtout utile (et je me répète désolé) quand nous créerons des types de Sprite plus complexes.
On décharge toutes les ressources
protected override void LoadContent() { spriteBatch = new SpriteBatch(GraphicsDevice); // Fond de l'écran backgroundSpace = Content.Load("background-space"); // Texture du vaisseau ship.LoadContent("ship"); // Position initiale du vaisseau ship.Position = new Vector2( (graphics.PreferredBackBufferWidth / 2) - ship.Width / 2, graphics.PreferredBackBufferHeight - ship.Height * 2); laser.LoadContent("laser"); base.LoadContent(); } |
Sans grosses surprises on charge le contenu et on initialise la position du vaisseau. Si vous reprenez l’ancien code vous pourrez constater que l’ancienne variable de position pour le vaisseau était nommée shipPosition, là vous rajoutez un point entre ship et Position et vous obtenez le code que j’ai écris plus haut. Et c’est le cas pour tout le reste du tutoriel.
// Libération des ressources protected override void UnloadContent() { backgroundSpace.Dispose(); ship.UnloadContent(); laser.UnloadContent(); base.UnloadContent(); } |
Toujours sans surprise les méthodes Dispose() sont remplacée par les méthodes UnloadContent(), il n’y a que pour le fond d’écran où c’est toujours pareil car lui n’est pas un Sprite (il pourrait).
Parce qu'il faut pouvoir tirer
private void shoot() { if (!laser.Active) { laser.Position = new Vector2( (ship.Position.X + (ship.Width / 2)) - laser.Width / 2, ship.Position.Y); laser.Active = true; // Le laser est tiré ! } } |
On utilise laser.Position à la place de laserPosition et ship.Position.X au lieu de shipPosition.X, le reste est identique. C’est marrent mais comme la classe Sprite a des propriétés Width et Height il n’y a pas de correction à faire sur ship.Width et ship.Height. On utilise la valeur de la propriété Active de l’objet laser pour vérifier si on peut tirer ou pas.
L'affichage
protected override void Draw(GameTime gameTime) { // Efface l'écran graphics.GraphicsDevice.Clear(Color.AliceBlue); // Début du mode dessin spriteBatch.Begin(); // On affichage le fond à la position 0, 0 spriteBatch.Draw(backgroundSpace, Vector2.Zero, Color.White); // On affiche le vaisseau à la position définie dans Update() ship.Draw(spriteBatch); // Si le laser est tiré on le dessine laser.Draw(spriteBatch); // Fin du mode dessin spriteBatch.End(); base.Draw(gameTime); } |
Nous verrons très prochainement comment dériver cette classe pour créer une entité répondant encore plus à nos besoins. En tout cas le constat actuel est clair, nous avons économisé des lignes de code même si on a « un peu » complexifié le tout.