2016-08-03 14 views
-2

Ich bin nicht sicher über die beste Vorgehensweise zum Abrufen und Aktualisieren von Eingaben, die von einem mit der GamePad-Klasse überwachten Controller in UWP empfangen wurden.Abrufen des Controller-Eingangs in der UWP-App

Ich habe ein paar Beispiele von Leuten gesehen, die Dispatch-Timer und asynchrone Loops im GamePadAdded-Event verwenden. In Win32-Anwendungen hätte ich Eingaben in der WinMain-Aktualisierungs-/Nachrichtenschleife verarbeitet, aber in UWP-Apps weiß ich nichts Ähnliches.

Gibt es eine Schleife in UWP-Apps, die wie in Win32-Apps eingegeben/behandelt werden sollte? Was ist das empfohlene Protokoll für die Abfrage von Eingaben von einem Eingabegerät (nominell ein Xbox One-Controller)?

Ich bin glücklich, mehr über UWP App Entwicklung zu lesen, aber ich bin mir nicht sicher von irgendwelchen Anleitungen, die so etwas verweisen.

Edit: Es wäre produktiv, wenn Sie, anstatt zu downvooten und weiterzugehen, Gedanken darüber haben, warum diese Frage einen Downvote verdient.

Antwort

2

Ich habe ein paar Beispiele von Menschen mit Dispatch-Timer und Asynchron-Schleifen innerhalb der Veranstaltung GamePadAdded gesehen

Dies ist der richtige Weg in UWP App Gamepad Daten zu lesen. Ein kleiner Vorschlag ist, den Loop-Leseteil auf den UI-Thread zu verschieben, wenn Sie die Benutzeroberfläche häufig aktualisieren müssen. blog

in diesem Zusammenhang die Lösung sehen, ist es eine Schleife in UWP-Anwendungen, die Eingabe sollte wie in Win32 gesammelt/gehandhabt werden apps

Sie können einen Wrapper mit benutzerdefinierten Ereignis machen, finden Sie in der Open-Source-Implementierung : XBoxGamepad

public class XBoxGamepad 
{ 
    private List<Gamepad> _controllers = new List<Gamepad>(); 
    private bool _running = true; 

    Task backgroundWorkTask; 

    public event EventHandler<GamepadButtons> OnXBoxGamepadButtonPressA; 
    //omitted...... 

    public XBoxGamepad() 
    { 
     Gamepad.GamepadAdded += Gamepad_GamepadAdded; 
     Gamepad.GamepadRemoved += Gamepad_GamepadRemoved; 
     backgroundWorkTask = Task.Run(() => PollGamepad()); 
    } 

    //omitted...... 

    private void Start() 
    { 
     _running = true; 
    } 

    public void Stop() 
    { 
     _running = false; 
    } 

    public async Task PollGamepad() 
    { 
     while (true) 
     { 
      if (_running) 
      { 
       foreach (Gamepad controller in _controllers) 
       { 
        if (controller.GetCurrentReading().Buttons == GamepadButtons.A) 
        { 
         OnXBoxGamepadButtonPressA(controller, controller.GetCurrentReading().Buttons); 
        } 
        //omitted...... 
       } 
      } 
      await Task.Delay(50); 
     } 
    } 

    private void Gamepad_GamepadRemoved(object sender, Gamepad e) 
    { 
     _controllers.Remove(e); 
    } 

    private void Gamepad_GamepadAdded(object sender, Gamepad e) 
    { 
     _controllers.Add(e); 
    } 
    }