XNA Atelier 06 La gestion des entrées Auteur Vincent Echelard Table des matières A. BUT DE L ATELIER... 2 B. LA GESTION DES ENTRÉES... 2 1. Introduction... 2 2. La stratégie... 2 3. Le composant InputManager... 3 C. TRAVAIL À RÉALISER... 4 D. MODALITÉ DE REMISE... 5 420-203-RE Développement de programmes dans un environnement graphique
A. But de l atelier Cet atelier vous permettra de vous initier aux divers aspects du développement d une application XNA liés à la gestion des périphériques d entrée de données. Pour commencer : 1. Téléchargez le fichier d archives contenant l atelier à compléter à partir de mon site Web (vechelard.clg.qc.ca). Ce fichier porte le nom «Atelier_06-Base.zip». 2. Décompressez le fichier d archives et ouvrez l atelier avec Visual Studio; B. La gestion des entrées 1. Introduction Dans un logiciel interactif, la relation avec l utilisateur doit de toute évidence être bidirectionnelle. Avec XNA, l utilisateur peut utiliser différents périphériques pour communiquer avec l application le clavier, la souris et la manette. Contrairement à ce qui se passe dans une application en interface graphique classique où la gestion des entrées revêt la forme d une gestion d événements, avec XNA l utilisation d un périphérique d entrée prendra la forme d une gestion de l état du périphérique. Il sera également nécessaire de prendre en considération les concepts liés au temps et à la gestion de la boucle de jeu. 2. La stratégie La première approche qui sera implémentée sera non événementielle dans la mesure où nous ne tenterons pas de profiter des capacités événementielles de XNA, mais plutôt orientée vers l analyse de l état des périphériques. Auteur : Vincent Echelard, 2015 Page 2
3. Le composant InputManager public class InputManager : Microsoft.Xna.Framework.GameComponent Keys[] AnciennesTouches get; set; Keys[] NouvellesTouches get; set; KeyboardState ÉtatClavier get; set; public InputManager(Game game) : base(game) public override void Initialize() AnciennesTouches = new Keys[0]; NouvellesTouches = new Keys[0]; base.initialize(); public override void Update(GameTime gametime) AnciennesTouches = NouvellesTouches; ÉtatClavier = Keyboard.GetState(); NouvellesTouches = ÉtatClavier.GetPressedKeys(); base.update(gametime); public bool EstClavierActivé get return NouvellesTouches.Length > 0; public bool EstEnfoncée(Keys touche) return ÉtatClavier.IsKeyDown(touche); public bool EstNouvelleTouche(Keys touche) int NbTouches = AnciennesTouches.Length; bool EstNouvelleTouche = ÉtatClavier.IsKeyDown(touche); int i = 0; while (i < NbTouches && EstNouvelleTouche) EstNouvelleTouche = AnciennesTouches[i]!= touche; ++i; return EstNouvelleTouche; Auteur : Vincent Echelard, 2015 Page 3
Comme vous pouvez le constater, ce composant se limite pour l instant à la gestion du clavier. Sa stratégie est la suivante : 1. L état du clavier est conservé dans deux tableaux qui contiennent chacun la liste des touches enfoncées, mais à des moments différents. Ainsi, le tableau NouvellesTouches contiendra l état actuel du clavier, tandis que le tableau AnciennesTouches contiendra l état précédent du clavier. La taille de ces tableaux dépend du nombre de touches simultanément enfoncées. 2. Les deux tableaux sont initialisés à vide lors de la construction du composant. 3. Dans la méthode Update() : a. le contenu du tableau NouvellesTouches est copié dans le tableau AnciennesTouches; b. le clavier est interrogé pour connaître son état (quelles sont les touches enfoncées); c. la liste des touches enfoncées est copiée dans le tableau NouvelleTouches. Pour savoir si une touche vient tout juste d être enfoncée, il suffit de vérifier si elle l était précédemment dans le tableau AncienneTouche. C. Travail à réaliser Vous devez compléter l atelier en réalisant les tâches suivantes : 1. modifiez le composant «InputManager» pour qu il puisse également gérer les différents états de la souris. Pour ce faire, il vous faudra implémenter les fonctionnalités suivantes : a. la propriété EstSourisActive //bool b. la méthode EstAncienClicDroit() //bool c. la méthode EstAncienClicGauche() //bool d. la méthode EstNouveauClicDroit() //bool e. la méthode EstNouveauClicGauche() //bool f. la méthode GetPositionSouris() //Point Note : Ces modifications n entraineront pas de changement aux paramètres actuels du constructeur du composant InputManager. Auteur : Vincent Echelard, 2015 Page 4
2. Créez un nouveau composant nommé «SpriteMobile» qui sera un descendant du composant «Sprite», mais qui aura les particularités suivantes : a. être déplaçable à l aide des touches classiques de déplacement au clavier (WASD); b. la vitesse de déplacement du sprite pourra être modifiée par les touches PageUp (accélération) et PageDown (décélération); et, c. Le constructeur de ce composant devrait avoir cette signature : public SpriteMobile(Game jeu, string nomimage, Vector2 position, float intervalmaj) D. Modalité de remise Vous devrez remettre, par Colnet, un fichier d archives qui contiendra les éléments suivants : 1. Le composant ArrièrePlanDéroulant; 2. Le composant InputManager; et, 3. Le composant SpriteMobile. N oubliez pas, pour chacun de ces composants, de respecter les constructeurs imposés. Votre fichier d archives devra s intituler comme suit : «Atelier 06 - Nom Prénom» Vous devrez remettre ce fichier d archives avant minuit le lundi 28 septembre 2015. Tout retard entraînera une pénalité. Auteur : Vincent Echelard, 2015 Page 5