FR | EN
Page générée en 0.183 sec
Imprimer

Gestion du joystick

Les joysticks et joypads se gèrent de la même manière. Plusieurs étapes sont nécessaires afin de pouvoir les gérer :

  • Recherche des Manettes de jeu installées et instancier de l'objet Device
  • Définition du format de données
  • Définition des paramètres de comportement de la manette (Cooperative Level)
  • Définition de la variation des axes (sensibilité)
  • Acquisition de l'accès à la manette
  • Récupération des informations de la manette

1. Recherche des Manettes de jeu installées et instancier de l'objet Device

Nous allons ici rechercher tous les controleurs de jeux qui sont installés à l'aide de la méthode GetDevices() de la classe Manager et instancier l'objet Device au controleur désiré. L'exemple qui suit sélectionne le premier controleur rencontré :

// Enumère les contrôleurs installés
foreach (DeviceInstance instance in Manager.GetDevices(DeviceClass.GameControl, 
EnumDevicesFlags.AttachedOnly)) { // Instancie le device avec le premier contrôleur this._deviceJoystick = new Device(instance.InstanceGuid); }

2. Définition du format de données

On initialise ici le format de données à celui du joystick à l'aide de la propriété SetDataFormat :

_deviceJoystick.SetDataFormat(DeviceDataFormat.Joystick);

3. Définition des paramètres de comportement de la manette (Cooperative Level)

Les niveaux de coopérativité sont les mêmes que le clavier : Exclusive / NonExclusive et Foreground / Background :

CooperativeLevelFlags _coopLevel;
_coopLevel = CooperativeLevelFlags.Exclusive;
_coopLevel |= CooperativeLevelFlags.Foreground;

On applique ensuite ces paramètres au device à l'aide de la méthode SetCooperativeLevel() prenant en paramètre la Form utilisée par l'application et le CooperativeLevel :

_deviceJoystick.SetCooperativeLevel(this, _coopLevel);

4. Définition de la variation des axes (sensibilité)

Certaines manettes comme le joystick étant analogique, nous devons définir la variation des axes correspondant à leur sensibilité. L'exemple qui suit énumère tous les objets du joystick et fixe une variation comprise en -1000 et +1000 pour chaque axe :

// Enumération des objets
foreach (DeviceObjectInstance DOI in _deviceJoystick.Objects)
{
	if (((DOI.ObjectId & (int)DeviceObjectTypeFlags.Axis) != 0))
	{
		// On fixe la variation de l'axe.
		_deviceJoystick.Properties.SetRange(ParameterHow.ById, DOI.ObjectId, 
new InputRange(-1000, +1000)); } }

La méthode SetRange() prend trois paramètres :

  • ParameterHow : Le fait de définir cette variable par ID nous permet d'envoyer l'ID de l'objet au paramètre suivant
  • Int : Correspond à l'ID de l'objet que l'on souhaite définir
  • InputRange : Correspond à la variation de l'axe

5. Acquisition de l'accès à la manette

On obtient l'accès au device grâce à la méthode Acquire(). Suivant les CooperativeLevel que vous avez sélectionnés, si la fenêtre perd le focus l'acquisition peut être perdue.

_deviceJoystick.Acquire();

6. Récupération des informations de la manette

Pour les manettes, la première étape est de mettre à jour les infos du device grace à la méthode poll(). Pour éviter toute erreur (device non "acquit"), placez le dans un try() catch() et essayez de le réacquérir :

_deviceJoystick.Poll();

Nous allons ensuite stocker l'état de la manette afin de récupérer les propriétés tel que la position sur l'axe des X et l'état des boutons :

// Récupération de l'état de la manette
JoystickState _etatJoystick = _deviceJoystick.CurrentJoystickState;
// Récupération des propriétés
int _x = _etatJoystick.X;
// Récupération de l'état des boutons
int _bouton = 0;
string _boutonsAppuyes;
foreach (byte b in _etatJoystick.GetButtons())
{
	// On vérifie si le bouton est enfoncé
	if (0!= (b & 0x80))
		_boutonsAppuyes += _bouton.ToString("00 ");
	_bouton++;
}
System.Windows.Forms.MessageBox.Show("X = " + _x.ToString() + \nBoutons : " + _boutonsAppuyes);
W3C - XHTML 1.0 Powered By Fedora W3C - CSS