ProfilProfil
 Registrieren
 Login
Bild der WocheBild der Woche

(von Backslider)
Kommentare (0)
****

Weitere
User onlineBenutzer online
Gäste online: 9
Mitglieder online: Keine
Registrierte Mitglieder: 2116
Neustes Mitglied: onkel_keks

GamePad

Autor: Astror Enales

Inhaltsverzeichnis

  1. Einleitung
  2. Abfragen des Status
  3. GamePadState
  4. Triggers
  5. ThumbSticks
  6. DPad
  7. Buttons
  8. Packet Nummer
  9. Vibration
  10. IsButtonDown/Up
  11. GetCapabilities

^ Einleitung


Neben der Maus und der Tastatur hat man in XNA die zusätzliche Möglichkeit Xbox GamePads zu verwenden.
Wie man den Status abfragt und entsprechend verwendet, wird euch in diesem Tutorial näher gebracht.

Zu finden sind die genutzten Klassen, Strukturen und Enumerationen im Namespace Microsoft.Xna.Framework.Input.






^ Abfragen des Status


Für das Abfragen des Gamepad-Status, insgesamt können es maximal vier Controller werden, benutzen wir die GamePad.GetState(...) Methode.
Diese verlangt mindestens die Enumeration PlayerIndex als Parameter, welcher den Controller angibt den wir abfragen wollen. Optional kann noch eine DeadZone angegeben werden. Bei der DeadZone gibt es zwei Möglichkeiten, welche das benutzen des ThumbSticks auf einer 2D-Ebene, wie zum Beispiel beim Fadenkreuz, verbessern soll. Zum Einen den zirkularen Modus, welcher die X- und Y-Achse zusammen gegen die DeadZone prüft und somit die "Kreisbewegung" mit dem Stick verbessert. Zum Anderen den IndependentAxes Modus, welcher die Achsen einzeln gegen die DeadZone prüft und somit die Bewegung der Achsen einzeln verbessert.
Aber zurück zur GetState-Methode. Der Rückgabewert der Methode ist die Struktur namens GamePadState. Diese enthält alle Werte, welche uns ein Controller liefern kann.

^ GamePadState


Der GamePadState ist in 4 Bereiche unterteilt: Trigger, ThumbStick, DPad und die Buttons.
Jeder Bereich ist eine eigene Struktur, welche die aktuellen Statusdaten beinhaltet.
Außerdem gibt es noch eine boolean Eigenschaft IsConnected, welche angibt ob der Controller angeschlossen und verwendbar ist, oder nicht.

^ Triggers


Die Trigger kann man am besten mit dem Abzug von z.b. einer Pistole vergleichen. Es gibt keinen eindeutigen Wert "gedrückt", oder "nicht gedrückt", sondern sie liefern einen fließenden Wert zurück, je nachdem wie stark sie gedrückt wurden.
Konkret geben die Left und Right Eigenschaften der GamePadTriggers Struktur eine float Variable zurück, welche im Wertebereich von 0 (nicht gedrückt), bis 1 (voll durchgedrückt) liegen.

Den linken und rechten Trigger erreicht man über folgenden Code:
gamePadState.Triggers.Left
gamePadState.Triggers.Right


^ ThumbSticks


Die beiden ThumbSticks des GamePads sind den Triggern ziemlich ähnlich. Es gibt keinen eindeutigen Status, sondern einen fließenden Übergang der Werte. Der Unterschied ist, dass die ThumbSticks jeweils zwei Richtungen haben in welche man sie bewegen kann, X und Y. Deshalb gibt auch die Left und Right Eigenschaft der GamePadThumbSticks Struktur einen Vector2 zurück, mit jeweils einem float Wert für X und Y. Der Wertebereich der floats erstreckt sich von -1.0 bis 1.0.
Das bedeutet, wenn der ThumbStick nicht berührt wird, gibt die Eigenschaft einen Vector2(0, 0) zurück. -1.0 ist jeweils der Wert für Links und Unten, sowie 1.0 für Rechts und Oben steht.

Beispielcode:
gamePadState.ThumbSticks.Left
gamePadState.ThumbSticks.Right


^ DPad


Wie im Bild oben zu erkennen, setzt sich das DPad aus vier Knöpfen zusammen, wovon jeder eine Richtung repräsentiert, genauso wie die Pfeiltasten bei der Tastatur. Demnach hat auch die "GamePadDPad" Struktur von Xna vier Eigenschaften für "Left", "Right", "Top" und "Down". Jede davon gibt die Enumeration "ButtonState" zurück, welche angibt ob der Knopf gedrückt wurde, oder nicht.

Beispielcode:
gamePadState.DPad.Left
gamePadState.DPad.Right
gamePadState.DPad.Up
gamePadState.DPad.Down


^ Buttons


Die normalen Buttons des GamePads sehen zwar sehr unterschiedlich aus und liegen auch nicht komplett zusammen, sind aber vom Prinzip nicht anders zu handhaben, als die Knöpfe vom DPad. Auch die Eigenschaften der GamePadButtons Struktur geben die Enumeration "ButtonState" zurück.

Insgesamt gibt es 11 Buttons:
gamePadState.Buttons.A
gamePadState.Buttons.B
gamePadState.Buttons.X
gamePadState.Buttons.Y
gamePadState.Buttons.Big
gamePadState.Buttons.Start
gamePadState.Buttons.Back
gamePadState.Buttons.LeftStick
gamePadState.Buttons.RightStick
gamePadState.Buttons.LeftShoulder
gamePadState.Buttons.RightShoulder


^ Packet Nummer


Die GamePad Struktur hat noch eine weitere Eigenschaft, die PacketNumber. Diese ist relativ schnell erklärt. Jedes mal wenn sich der Status eines GamePads ändert, verändert sich die PacketNumber. Demnach bleibt sie gleich, wenn nichts gedrückt, bewegt, oder losgelassen wurde.
Dies gibt uns die Möglichkeit, relativ schnell zu checken, ob wir durch unseren ganzen Input Code gehen müssen, oder ob alles beim Alten ist.

^ Vibration


Wie jedes vernünftige GamePad kann natürlich auch der XBox Controller vibrieren. Dabei gibt es häufig einen linken und einen rechten Motor im Controller, welche man seperat ansteuern kann.
In Xna hat die GamePad Klasse eine statische Methode: "SetVibration". Diese möchte 3 Parameter, den PlayerIndex, also welches GamePad von den vieren vibrieren soll, den Virbationswert für den linken und den für den rechten Motor. Der Vibrationswert wird als float angegeben und liegt im Bereich von 0,0 bis 1,0.
Achtung: Wenn man das Vibrieren wieder abstellen will, dann muss man noch einmal die Methode aufrufen und bei den Motorwerten jeweils 0.0 übergeben!
Zur Überprüfung ob das Einstellen der Vibration geklappt hat, gibt die Methode einen bool zurück.
GamePad.SetVibration(PlayerIndex.One, 0.5f, 0.5f);


^ IsButtonDown/Up


Bisher haben wir jeden verfügbaren Button oder Trigger über die extra Strukturen des GamePadState abgefragt. Und wenn man einfach wissen möchte, ob ein Trigger oder Thumbstick überhaupt benutzt wird, benötigt man auf diese Weise einen umständlichen Check wie:
if(gamePadState.ThumbSticks.Left.X != 0f &&
  gamePadState.ThumbSticks.Left.Y != 0f)

Das macht auf Dauer keinen Spaß. Deshalb gibt es im GamePadState zwei extra Methoden: IsButtonDown und IsButtonUp. Diese Methoden haben als einzigen Parameter die Buttons Enumeration, welche nicht nur alle Knöpfe beinhaltet, sondern auch jede Richtung der Sticks, sowie die Triggers. Als Rückgabewert bekommen wir einen einfachen boolean Wert, der angibt, ob der Button gedrückt ist, oder nicht. Je nach Methodenaufruf.
Somit haben wir eine schnelle und einfache Möglichkeit zur Überprüfung, ob eine spezifische Eingabe gemacht wurde, oder nicht.

Hinzuzufügen ist noch, das man den Methodenparameter, also den Buttons Enum, auch bitwise OR kombinieren kann. Die Methoden wird dann alle zusammen überprüfen und den Rückgabewert dann auch entsprechend für alle zusammen ausgeben. Das ist praktisch, wenn man z.b. überprüfen möchte, ob der X und der A Knopf gleichzeitig gedrückt wurden.
if(gamePadState.IsButtonDown(Buttons.X | Buttons.A))


^ GetCapabilities


Abschließen gehe ich noch kurz auf die statische Methode GetCapabilities der GamePad Klasse ein. Wie der Name schon sagt, überprüft die Methode die "Fähigkeiten" des GamePads und gibt diese als GamePadCapabilities Struktur zurück.
Die Struktur beinhaltet generell je einen boolean Wert für jeden Button, ThumbStick, Trigger usw., welcher jeweils angibt ob das Steuerelement verfügbar ist. Ebenso gibt es je ein boolean für den linken und den rechten Motor und zusätzlich noch einen der angibt, ob das GamePad Sprachaufnahmefähig ist:
gamePadCaps.HasAButton
gamePadCaps.HasBackButton
gamePadCaps.HasBButton
gamePadCaps.HasBigButton
gamePadCaps.HasDPadDownButton
gamePadCaps.HasDPadLeftButton
gamePadCaps.HasDPadRightButton
gamePadCaps.HasDPadUpButton
gamePadCaps.HasLeftShoulderButton
gamePadCaps.HasLeftStickButton
gamePadCaps.HasLeftTrigger
gamePadCaps.HasLeftVibrationMotor
gamePadCaps.HasLeftXThumbStick
gamePadCaps.HasLeftYThumbStick
gamePadCaps.HasRightShoulderButton
gamePadCaps.HasRightStickButton
gamePadCaps.HasRightTrigger
gamePadCaps.HasRightVibrationMotor
gamePadCaps.HasRightXThumbStick
gamePadCaps.HasRightYThumbStick
gamePadCaps.HasStartButton
gamePadCaps.HasVoiceSupport
gamePadCaps.HasXButton
gamePadCaps.HasYButton

Ebenso wie die GamePadState Struktur hat auch die GamePadCapabilities Struktur die Eigenschaft IsConnected.
Schlussendlich können wir über die GamePadType Eigenschaft noch genauere Informationen bekommen, um welche Art von Controller es sich handelt. Dabei reicht die Spanne von einfachen Controllern, über Gitarren, bis hin zu Lenkrädern und Flugsticks.


Ich bedanke mich für das Durchlesen und freue mich wie immer über Lob, Kritik, spontanen Jubel und dergleichen Wink

Infos

Name: GamePad
Autor: Astror Enales
Kommentare: Thread