Didacticiel XNA : Partie 2 – Hello World

Image hosted by uppix.net

Objectifs :

Pour cette deuxième partie nous allons nous intéresser à la création d’un programme affichant « Hello World » à l’écran en utilisant XNA.

Sommaire :

XNA : « Hello World »

Création d’un nouveau projet

Rentrons dans le vif du sujet. Commencez par créer un nouveau projet sur Visual Studio :

Image hosted by uppix.net

Vous vous retrouvez alors avec une classe déjà créée, remplie et ouverte sous vos yeux : Game1.cs. Votre solution contient aussi différents éléments. Assurez-vous déjà que tout marche bien en lançant votre premier jeu. Vous devriez obtenir un écran bleu. Pas le BSOD de Windows heureusement, mais un beau bleu dans une fenêtre :

Image hosted by uppix.net

Tout est prêt pour attaquer.

La classe Game

La base de tout jeu XNA est cette classe. Elle est lancée par la méthode Main contenue dans la classe Program, et elle définie un ensemble de méthode qui simplifie l’organisation de son code.

Image hosted by uppix.netLe schéma ci-dessus vous présente l’ordre d’appel des méthodes.

  • Le constructeur (Game1()) est appelé en premier, et il n’est appelé qu’une seule fois.
  • La méthode Initialize() sert à initialiser les variables du jeu (score, vies, etc). Elle est appelé juste après le constructeur, mais rien ne vous empêche de l’appeler par la suite.
  • LoadContent() est primordiale. XNA utilise une Pipeline (tunnel) qui permet d’importer n’importe quoi (Sprite, image, modèle 3D, son, etc) dans le jeu très simplement. C’est dans cette méthode que doivent être chargées toutes les images, tous les sons, tous les médias nécessaires à votre jeu. Et tous ces médias doivent se trouver dans le dossier « Content » qui a été créé avec la solution. C’est un dossier spécial qui sera traité par le Pipeline.
  • Un jeu est un programme composé principalement d’une boucle infinie. Cette boucle s’arrête quand l’utilisateur ferme le jeu. Chaque tour de boucle compose une Frame qui est affichée à l’écran. Pour qu’un jeu soit fluide il faut essayer d’avoir 60 Frames par secondes. A chaque Frame, XNA appelle la méthode Update() qui calcule la logique du jeu (positions, collisions, entrées utilisateurs, etc) puis Draw() qui s’occupe de l’affichage des données. C’est cette logique qu’il faut bien comprendre car c’est le cœur même d’XNA.

EDIT : (Voir commentaire d’XNAConnection) Ces méthodes ne sont pas appelées successivement, mais tournent en parallèle dans des threads séparés. Cependant l’illusion de la séquentialité est parfaite je trouve :P

  • UnloadContent peut servir à effectuer des actions particulières lors de la fermeture du jeu.

Cette classe possède également deux attributs :

  • GraphicsDeviceManager graphics;
  • SpriteBatch spriteBatch;

On ne s »intéressera pour l’instant qu’au deuxième qui permet d’afficher à l’écran des textures (un sprite étant une texture appliqué sur un plan).

Afficher du texte

Autant vous prévenir tout de suite, XNA gère mal l’affichage du texte à l’écran. Cela n’empêche pas qu’il y a quelques méthodes existantes pour le faire.

La première chose à faire est de créer une police d’écriture qui sera chargée et utilisée par le jeu.

Image hosted by uppix.net

  • Dans le dossier Content, clic droit
  • Ajouter un nouveau élément
  • Créer une nouvelle police : « Sprite Font« 

Visual Studio vous ouvre alors le fichier spriteFont (XML), qui définit la taille, la police utilisée et d’autres informations modifiables si besoin.

Ajoutez  un attribut SpriteFont à votre classe Game1.

GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
SpriteFont font;

Il faut ensuite charger la police avec le Pipeline (aussi appelé ContentManager). Dans LoadContent, ajoutez :

font = Content.Load<SpriteFont>(@"SpriteFont1");

Vous remarquerez :

  • Le « @ », qui concatène le chemin du dossier « Content » devant le chemin de l’objet à charger.
  • L’absence d’extension pour le fichier à charger. En effet le ContentManager transforme tout et l’accès aux fichiers transformés se fait sur le nom (asset name dans les propriétés) simplement.

Enfin, il faut ajouter au programme l’affichage d’un texte avec cette police.

Dans la méthode Draw(), ajoutez :

spriteBatch.Begin();
spriteBatch.DrawString(font, "Hello World !", new Vector2(), Color.Yellow);
spriteBatch.End();

Le spriteBatch est donc l’élément clé de tout affichage. Avant toute utilisation, il doit être initialisé avec Begin() (nous verrons plus tard les paramètres optionnels), et il doit être clos avec la méthode End().

Entre ces deux appels, vous pouvez faire différents affichages (qui utiliseront les paramètres spécifiés dans Begin(), mais ici, on s’en fiche :) ) de textes avec DrawString() ou de textures avec Draw().

Pour afficher notre « Hello World » nous utiliserons donc la première méthode, en lui passant en paramètre :

  • La police (SpriteFont) à utiliser
  • Le texte
  • La position du texte, sous la forme d’un Vector2. Ici j’utilise un vecteur par défaut, à (0,0) mais vous pouvez changer ça dans les paramètres du constructeur.
  • La couleur du texte. XNA définit une palette de couleur dans la classe Color, et il est également possible d’en créer une nouvelle (new Color(…)) pour par exemple spécifié le canal alpha de la couleur et donc la transparence.

Vous obtiendrez un magnifique (tout est relatif) texte :

Image hosted by uppix.net

Nous allons voir par la suite comment afficher des images quelconques, des sprites ou des fonds d’écrans par exemple :)

3 commentaires sur “Didacticiel XNA : Partie 2 – Hello World”

  1. Juste un truc au sujet du graphe de fonctionnement entre la boucle Update() et Draw(): contrairement à ce que l’on peut penser ces deux boucles ne sont pas apellées l’une après l’autre; le jeu maintient deux threads, un pour le rendu, et un pour l’update, ce qui fait que ces derniers peuvent tourner à une fréquence différente.

    Il est vrai que dans la configuration de base, les deux threads fonctionnent à la même vitesse, ce qui fait qu’on peut avoir l’impression que le jeu appelle Update() puis Draw() l’un a la suite de l’autre. Mais il suffit que l’on shunte Game.IsFixedTimeStep pour ne plus être dans ce cas…

  2. Valryon dit :

    Ah merci, je ne le savais pas du tout =)
    Je vais corriger ça alors.

Laisser une réponse

Spam Protection by WP-SpamFree