【问题标题】:How to Poll For Controller Input In UWP App如何在 UWP 应用中轮询控制器输入
【发布时间】:2016-08-03 03:41:37
【问题描述】:

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

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

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

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

编辑:如果您不投反对票并继续前进,而是分享关于为什么这个问题值得投反对票的想法,那将是富有成效的。

【问题讨论】:

    标签: events input controller uwp


    【解决方案1】:

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

    这是 UWP 应用中读取 Gamepad 数据的正确方法。一个小建议是,如果您需要频繁更新 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);
        }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-02
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 2014-10-09
      • 2017-09-24
      相关资源
      最近更新 更多