如何在UWP App中轮询控制器输入

时间:2016-08-03 03:41:37

标签: events input controller uwp

我不确定获取和更新从使用UWP中的GamePad类监控的控制器接收的输入的最佳做法。

我见过几个人在GamePadAdded事件中使用Dispatch Timers和async循环的例子。在Win32应用程序中,我会在WinMain更新/消息循环中处理输入,但在UWP应用程序中我不知道任何类似的东西。

UWP应用程序中是否存在应该像在Win32应用程序中那样收集/处理输入的循环?从输入设备(名义上是Xbox One控制器)轮询输入的推荐协议是什么?

我很高兴阅读有关UWP应用程序开发的更多信息,但我不确定任何引用此类内容的指南。

编辑:如果你没有贬低和继续前进,那么你会分享为什么这个问题值得进行投票的想法。

1 个答案:

答案 0 :(得分:2)

  

我见过几个人在GamePadAdded事件中使用Dispatch Timers和async循环的例子

这是UWP应用程序中读取游戏手柄数据的正确方法。一个小小的建议是,如果您需要经常更新UI,请在UI线程上移动循环读取部分。请参阅此blog

中的解决方案
  

UWP应用程序中是否存在应该像在Win32应用程序中那样收集/处理输入的循环

您可以使用自定义事件创建包装器,请参阅开源实现: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);
    }
    }