Didacticiel XNA : Partie 5 – Entrées/Sorties

Image hosted by uppix.net

Objectifs :

Cette partie est dédiée à tout ce qui peut remplir la méthode Update() : collisions et déplacements en particulier.

Sommaire :

XNA : Gestion des entrées / sorties pour un jeu

C’est bien beau d’avoir un cactus qui se balade tout seul sur l’écran, mais c’est quand même un jeu qui l’on souhaite produire. Donc quelque chose qui propose un minimum d’interaction avec l’utilisateur.

XNA est prévu pour PC et Xbox360 et est développé par Microsoft, il n’est donc pas surprenant que le clavier , la souris et le GamePad xbox360 soit supporté nativement (ce dernier pouvant être relié à un PC).

manette xbox 360

Si par contre vous voulez gérer des manettes autres, branchées sur le port USB par exemple, là c’est une autre histoire… XNA ne propose rien pour cela.

Le clavier

La gestion du clavier en XNA est à la fois simple et catastrophique. Simple car il suffit de récupérer un objet pour avoir accès à toutes les touches enfoncées / relevées, etc.


//Entrée joueur : clavier
KeyboardState keyboard = Keyboard.GetState();
if (keyboard.IsKeyDown(Keys.Left))
{
//...
}

L’énumération Keys contient toutes les touches que vous pouvez trouver sur un clavier actuel, même les touches de contrôle de médias comme la gestion du volume.

Difficile de s’étendre longtemps sur l’utilisation donc. Par contre si vous voulez faire de la saisie de texte (le nom du joueur par exemple), alors là bon courage ! XNA ne gère pas de composant tout magique comme un champ de texte, il va falloir vous créer le votre, et gérer aussi bien l’ajout de caractères que les retours arrières, etc. J’imagine que c’est trouvable tout fait sur Internet mais c’est quand même dommage de ne rien avoir par défaut.

La souris

Je serai bref : la souris se gère comme le clavier :

//Entrée joueur : souris
MouseState mouse = Mouse.GetState()
if (mouse.LeftButton == ButtonState.Released)
{
...
}

MouseState possède comme propriétés les différents boutons que vous pouvez espérer trouver pour une souris normale.

Petit truc qui peut servir, il est facile de forcer le curseur de la souris à se placer à une position précise de l’écran grâce à:

Mouse.SetPosition(x,y);

Manette Xbox 360

Le périphérique le mieux géré à mon avis par XNA est bien la manette de Microsoft. Pas besoin de chercher pourquoi, mais il faut admettre que ce contrôleur est plutôt bien. XNA permet de gérer jusqu’à 4 manettes en même temps : idéal pour un jeu multijoueurs en écran splitté.

Sans surprise la récupération des informations pour une manette est similaire aux autres périphériques :

GamePadState pad = GamePad.GetState(PlayerIndex.One);

Notez que PlayerIndex est un simple entier valant entre 1 et 4. Il correspond au numéro du joueur qui tient la manette.

pad contient :

  • Les flèches directionnelles : Dpad
  • Les boutons de la manette, et des méthodes isButtonDown/Up() pour connaître leur état
  • Le joystick gauche : ThumbSticks.Left
  • et droite : ThumbSticks.Right
  • Les gachettes : Gauche et droite respectivement Triggers.Left et Triggers.Right

Que demander de plus ?

Les vibrations bien sûr !

Elles sont ajustables grâce à :

GamePad.SetVibration(PlayerIndex.One, 1.0f, 1.0f);

Où 1.0f est une valeur arbitraire qui peut être ajuster pour correspondre à la sensation souhaitée. Si vous essayez cette méthode, vous remarquerez que les vibrations ne s’arrêtent jamais : c’est normal ! Il faut soi-même la faire décroître en ré-appelant SetVibration(..) tout en faisant décroître la valeur de la secousse.

Une bonne manière de gérer plusieurs périphériques

Laisser le choix des armes à son joueur vous fera toujours gagner quelque points de sympathie avec ce dernier (Même si ce n’est applicable que sur PC). Une bonne manière de gérer plusieurs entrées de manière très simple est la suivante :

  • Vous contrôlez les différents états des périphériques
  • En fonction des boutons / directions, vous mettez des variables booléennes à vrai
  • En fonction de ces variables, vous effectuez des actions

Soit, pour mieux comprendre :

KeyboardState keyboard = Keyboard.GetState();
MouseState mouse = Mouse.GetState();
GamePadState pad = GamePad.GetState(PlayerIndex.One);

bool tirer = false;

if (keyboard.IsKeyDown(Keys.Space)) tirer = true;
if (mouse.LeftButton == ButtonState.Pressed) tirer = true;
if (pad.IsButtonDown(Buttons.A)) tirer = true;

if (tirer)
{
///...
}

On peut encore factoriser ça mais c’est pour que le code reste lisible. Vous séparez ainsi l’acquisition de l’action du joueur par un contrôleur et le traitement de cet action.

Les sorties

Les sorties possibles ne sont pas l’intérêt principal d’un jeu vidéo. Sauf pour le partage de score, et de quelques autres données par Internet, on ne peut pas dire que cet élément soit crucial pour le jeu.

Outre l’écran, il est possible (même sur Xbox) de lire/écrire des fichiers (texte, binaires ou XML).

Il est probablement possible d’envoyer / recevoir des données par Internet.

Enfin la Xbox 360 propose des services particuliers avec le Xbox Live, mais n’ayant pas de consoles, je ne suis pas en mesure de parler de cela.

Les fichiers

Important pour la Xbox : Pour accéder aux fichiers stockés dans votre solution, comme vous ne pouvez pas savoir où ils sont sur la console, il faut utiliser :

String chemin = StorageContainer.TitleLocation + "\\" + "Le chemin dans votre solution"

Compatible PC / Xbox sans problème.

Les fichiers textes

Idéal pour lire des fichiers contenant du texte (sous-titres, descriptions, format de niveau).

On utilisera les classes StreamReader / StreamWriter de l’assembly System.IO.

Exemple pour la lecture :

StreamReader sr = new StreamReader(chemin);
while(String ligne = sr.ReadLine()) {
//Traitement de la ligne
};

Les fichiers binaires

Pour lire et sauver des objets instanciés, il est possible de les stocker dans un fichier.

Il suffit d’utiliser les classes BinaryReader / BinaryWriter de l’assembly System.IO.

Même principe que pour le fichier texte.

Les fichiers XML

Enfin, pour faire du XML pas très propre (il faut faire un parser à la main, il me semble que la Xbox ne gère pas l’utilisation de schéma), on utilisera XmlTextReader / Writer de l’assembly System.Xml.

Exemple de lecture :

XmlTextReader docxml = new XmlTextReader(chemin);
docxml.Read();
if (!docxml.Name.Equals("Mon jeu"))
{
throw new Exception("...");
}
version = docxml.GetAttribute("Version");

Conclusion

Vous avez peut-être l’impression que je suis allé trop vite, et, oui, je pense aussi que je ne me suis pas attardé. Il existe une tonne d’aide pour la gestion des fichiers, qui est déjà très simplifiée en .NET, donc plutôt que de vous expliquer la roue je préfère me contenter de vous la montrer.

Vous aurez aussi compris que la gestion des contrôles en XNA est très simple et agréable, même si cela pourrait être encore mieux (gestion d’un délai entre deux appuis de touches, gestion automatique de l’atténuation des vibrations, etc).

A la demande de LapinouFou le prochain article devrait être sur la structure du code pour un petit jeu telle que je la conçois, même si ce n’est qu’une possibilité parmi une infinité.

Un commentaire sur “Didacticiel XNA : Partie 5 – Entrées/Sorties”

Laisser une réponse

Spam Protection by WP-SpamFree