Création de la classe
Pour créer la classe, c'est très simple, il suffit de faire un clic droit sur le projet dans Visual Studio puis de faire
Add >
Class.
Une fenêtre apparait, il suffit de choisir un nom à votre classe puis de faire
Add.
Vous devriez donc maintenant avoir ce code dans le nouveau fichier créé.
Code : C# | using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CreationProjetXNA
{
class Sprite
{
}
}
|
L'implémentation
La première chose à faire va être d'ajouter quelques clauses using à la suite de celles déjà présentes pour pouvoir utiliser le Framework XNA.
Pour faire simple on va reprendre celles qui sont dans le fichier
FirstGame.cs et qui sont en relation avec XNA.
Code : C# | using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
|
On ajoute ensuite les attributs et propriétés de notre classe qui correspondent en réalité aux caractéristiques que l'on a énumérées juste avant.
Code : C# 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 | public class Sprite
{
/// <summary>
/// Récupère ou définit l'image du sprite
/// </summary>
public Texture2D Texture
{
get { return _texture; }
set { _texture = value; }
}
private Texture2D _texture;
/// <summary>
/// Récupère ou définit la position du Sprite
/// </summary>
public Vector2 Position
{
get { return _position; }
set { _position = value; }
}
private Vector2 _position;
/// <summary>
/// Récupère ou définit la direction du sprite. Lorsque la direction est modifiée, elle est automatiquement normalisée.
/// </summary>
public Vector2 Direction
{
get { return _direction; }
set { _direction = Vector2.Normalize(value); }
}
private Vector2 _direction;
/// <summary>
/// Récupère ou définit la vitesse de déplacement du sprite.
/// </summary>
public float Speed
{
get { return _speed; }
set { _speed = value; }
}
private float _speed;
}
|
Et enfin, on y ajoute nos méthodes.
Code : C# 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 | /// <summary>
/// Initialise les variables du Sprite
/// </summary>
public virtual void Initialize()
{
_position = Vector2.Zero;
_direction = Vector2.Zero;
_speed = 0;
}
/// <summary>
/// Charge l'image voulue grâce au ContentManager donné
/// </summary>
/// <param name="content">Le ContentManager qui chargera l'image</param>
/// <param name="assetName">L'asset name de l'image à charger pour ce Sprite</param>
public virtual void LoadContent(ContentManager content, string assetName)
{
_texture = content.Load<Texture2D>(assetName);
}
/// <summary>
/// Met à jour les variables du sprite
/// </summary>
/// <param name="gameTime">Le GameTime associé à la frame</param>
public virtual void Update(GameTime gameTime)
{
_position += _direction * _speed * (float)gameTime.ElapsedGameTime.TotalMilliseconds;
}
/// <summary>
/// Permet de gérer les entrées du joueur
/// </summary>
/// <param name="keyboardState">L'état du clavier à tester</param>
/// <param name="mouseState">L'état de la souris à tester</param>
/// <param name="joueurNum">Le numéro du joueur qui doit être surveillé</param>
public virtual void HandleInput(KeyboardState keyboardState, MouseState mouseState)
{
}
/// <summary>
/// Dessine le sprite en utilisant ses attributs et le spritebatch donné
/// </summary>
/// <param name="spriteBatch">Le spritebatch avec lequel dessiner</param>
/// <param name="gameTime">Le GameTime de la frame</param>
public virtual void Draw(SpriteBatch spriteBatch, GameTime gameTime)
{
spriteBatch.Draw(_texture, _position, Color.White);
}
|
Je ne vais pas revenir en détail sur toutes les méthodes, elle ne sont pas dures à comprendre et on a déjà tout vu précédemment.

Notez quand même que l'on utilise le mot clef
virtual sur chacune de nos méthodes pour la simple raison que l'on aura certainement besoin de ré-implémenter certaines de ces fonctionnalités dans les classes enfants pour obtenir des comportements plus spécifiques.
Je vais juste dire un petit mot sur la méthode
LoadContent et la méthode
Draw puisque c'est assez nouveau ici.
On doit passer à
LoadContent deux paramètres, un
ContentManager et un
string représentant l'asset name de l'image.
Il n'y a rien de compliqué mais on est obligé de faire ceci car la classe
Sprite est "isolée" du contexte de la classe principale, il faut donc lui fournir le
ContentManager qui va bien (l'attribut
Content de la classe principale) et lui dire depuis l'extérieur quelle image charger (sinon tous les sprites auraient la même image donc peu intéressant).
Et pour la méthode
Draw, vous vous posez surement une question si vous avez bien suivi le cours jusqu'à présent.
Eh ! Pourquoi il n'y a pas Begin() avant et End() après la méthode Draw() du SpriteBatch ??
Effectivement

, ce n'est pas un oubli et il faudra les mettre quelque part. Cependant le
spriteBatch.Begin() est une opération assez lourde et qui prend du temps à être faite donc il vaut mieux l'ouvrir une seule fois, dessiner tous les sprites et le refermer ensuite que de l'ouvrir et le fermer à chaque fois que l'on veut dessiner un sprite.
L'utilisation
Si vous avez bien compris l'implémentation de la classe alors l'utilisation sera un jeu d'enfant !
Vous pouvez enlever du fichier
FirstGame.cs tout ce qui traite de Zozor puisqu'on va tout refaire en utilisant la classe Sprite.
On va donc commencer par créer notre Zozor, sauf que cette fois ci, ce n'est plus un simple
Texture2D mais bien un Sprite.
Code : C#
C'est ensuite très logique puisque l'on a respecté l'architecture de XNA, on le créé et on l'initialise dans ...
Initialize() !
Code : C# | protected override void Initialize()
{
_zozor = new Sprite();
_zozor.Initialize();
base.Initialize();
}
|
Puis on charge l'image de Zozor dans
LoadContent en utilisant la méthode de la classe Sprite.
Code : C# | protected override void LoadContent()
{
// Create a new SpriteBatch, which can be used to draw textures.
spriteBatch = new SpriteBatch(GraphicsDevice);
_zozor.LoadContent(Content, "zozor6");
}
|
Et enfin on le met à jour et on le dessine.
Code : C# 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | protected override void Update(GameTime gameTime)
{
_zozor.Update(gameTime);
base.Update(gameTime);
}
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
spriteBatch.Begin();
_zozor.Draw(spriteBatch, gameTime);
spriteBatch.End();
base.Draw(gameTime);
}
|
Vous pouvez maintenant lancer le jeu et voir que Zozor est toujours là mais cette fois-ci grâce à la classe Sprite.

Modifiez ses attributs direction, vitesse, etc... si vous souhaitez le faire bouger. Cela dit, vous ne pourrez pas le faire rebondir sur les murs pour la simple et bonne raison que la classe
Sprite ne le prévoit pas.
Pour ajouter cette possibilité il faudrait créer une autre classe, Zozor par exemple qui hérite de la classe Sprite et qui ajoute la fonctionnalité du rebondissement en réécrivant la méthode
Update().

Mais je m'avance un peu, vous aurez bien le temps de comprendre ceci par la suite grâce au TP !