J'ai un contrôleur XBox360 que j'aimerais utiliser comme entrée pour une application.
Ce que je ne peux pas déterminer, c'est la meilleure façon d'exposer cela via une interface.
Dans les coulisses, la classe qui gère le ou les contrôleurs s'appuie sur l'état du bouton d'interrogation.
J'ai d'abord essayé quelque chose de lien:
Event ButtonPressed() as ButtonEnum
où ButtonEnum
était ButtonRed
, ButtonStart
, etc ...
Ceci est un peu limité en ce qu'il ne prend en charge que les pressions sur les boutons, pas les prises / motifs (appuyez deux fois, etc.)
L'idée suivante était d'exposer simplement l'état du bouton à l'application, par exemple
Property RedPressed as Boolean
Property StartPressed as Boolean
Property Thumb1XAxis as Double
C'est très flexible, mais cela oblige vraiment trop de travail dans l'application et nécessite que l'application interroge - je préférerais si possible les événements.
J'ai envisagé d'ajouter plusieurs événements, par exemple:
Event ButtonPressed(Button as ButtonEnum)
Event ButtonPressedTwice(Button as ButtonEnum)
Event ButtonHeldStart(Button as ButtonEnum)
Event ButtonHeldEnd(Button as ButtonEnum)
mais cela semble un peu maladroit et a été une vraie douleur sur l'écran "Bind button".
Quelqu'un peut-il m'indiquer la manière "correcte" de gérer les entrées des contrôleurs.
NB: J'utilise SlimDX dans la classe qui implémente l'interface. Cela me permet de lire l'état très facilement. Toutes les alternatives qui résoudraient mon problème sont également appréciées
Honnêtement, je dirais que l'interface optimale dépendra fortement de l'utilisation dans le jeu. Cependant, pour un scénario d'utilisation général, je suggérerais une architecture à deux niveaux qui sépare les approches basées sur les événements et les sondages.
Le niveau inférieur peut être considéré comme le niveau "basé sur l'interrogation" et expose l'état actuel d'un bouton. Une telle interface pourrait simplement avoir 2 fonctions,
GetAnalogState(InputIdentifier)
etGetDigitalState(InputIdentifier)
oùInputIdentifier
est une valeur énumérée représentant le bouton, le déclencheur ou le bâton contre lequel vous vérifiez. (L'exécution de GetAnalogState pour un bouton retournerait 1.0 ou 0.0, et l'exécution de GetDigitalState pour un stick analogique retournerait vrai si au-dessus d'un seuil prédéfini, ou faux sinon).Le deuxième niveau utiliserait ensuite le niveau inférieur pour générer des événements lors d'un changement d'état et permettre aux éléments de s'inscrire aux rappels (les événements C # sont glorieux). Ces rappels incluraient des événements pour la presse, la libération, le tapotement, la longue tenue, etc. Pour un stick analogique, vous pouvez inclure des gestes, par exemple QCF pour un jeu de combat. Le nombre d'événements exposés dépendrait du niveau de détail d'un événement que vous souhaitez envoyer. Vous pouvez simplement tirer un simple
ButtonStateChanged(InputIdentifier)
si vous souhaitez gérer tout le reste dans une logique distincte.Donc, si vous avez besoin de vérifier l'état actuel d'un bouton d'entrée ou d'une manette de contrôle, vérifiez le niveau inférieur. Si vous souhaitez simplement déclencher une fonction lors d'un événement d'entrée, inscrivez-vous pour un rappel à partir du deuxième niveau.
la source