Ich versuche, dem Player zu erlauben, eine beliebige Taste zu drücken, um von der Hauptseite fortzufahren. Ich konnte dies tun, indem ich eine Liste von Schaltflächen erstellte, diese durchlief und überprüfte, ob eine davon ausgefallen war. Ich finde diesen Code jedoch irgendwie hässlich und frage mich, ob es einen einfacheren Weg gibt, an den ich einfach nicht denke.
So sieht mein Code jetzt aus:
if (GamePad.GetState(PlayerIndex.One).IsConnected)
{
var buttonList = new List<Buttons>()
{
{Buttons.A},
{Buttons.B},
{Buttons.Y},
{Buttons.X},
{Buttons.Start},
{Buttons.Back},
{Buttons.RightShoulder},
{Buttons.LeftShoulder},
{Buttons.RightTrigger},
{Buttons.LeftTrigger}
};
foreach (var button in buttonList)
{
if (GamePad.GetState(PlayerIndex.One).IsButtonDown(button))
ExitMainMenu= true;
}
}
Antworten:
Dies sollte den Job machen. Speichern Sie am Ende jeder Aktualisierungsschleife den Status von
previousGamePadState
. Dann kannst du sie vergleichen. Dies ist ein schneller Weg, um Änderungen zu erkennen. Keine Notwendigkeit zu schleifen.GamePadState.PacketNumber :
Mit PacketNumber können Sie feststellen, ob sich der Eingabestatus geändert hat. Wenn der Wert von PacketNumber zwischen zwei aufeinander folgenden Aufrufen von GetState gleich bleibt, hat sich die Eingabe nicht geändert.
BEARBEITEN: In Methode geändert. Es ist nicht garantiert, dass es richtig funktioniert, sollte aber funktionieren. Da dies tatsächlich Änderungen in der Eingabe erkennt, wird dies auch angezeigt, wenn der Benutzer die Schaltfläche loslässt. Ich habe auch hinzugefügt
if
, um die Bewegung des Daumensticks zu erkennen, sodass Sie diese zumindest ignorieren können.Hoffe das hilft dir. Lassen Sie mich wissen, wenn es nicht Ihren Bedürfnissen entspricht, können wir das sicher klären.
Gewusst wie: Ermitteln, ob eine Controller-Taste auf diese Frame- GamePadState.PacketNumber-Eigenschaft gedrückt wurde
quelle
GamePadState
und zu schreibenenum Buttons
, die näher an dem Kontext liegt, den das OP zu verwenden scheint.Wenn Ihnen die Verwendung von Reflection nichts ausmacht, können Sie so etwas verwenden (möglicherweise sogar genau das):
quelle
Sie können ein Leerzeichen
GamePadState
manuell erstellen und es dann auf (Un-) Gleichheit mit dem aktuellen realen prüfen , das Sie durch Aufrufen abrufenGamePad.GetState
.quelle
Equals
ist anders; Es vergleicht zwei Referenzen, um dieselbe Instanz zu sein. ÜberlädtGamePadState
aber den Operator ==, um seine Werte zu vergleichen, auf die ich in meiner Antwort (op_Equality
) verwiesen habe .Da Buttons eine Aufzählung ist, können Sie die Enum.GetValues- Methode wie folgt verwenden:
quelle