我不确定获取和更新从使用UWP中的GamePad类监控的控制器接收的输入的最佳做法。
我见过几个人在GamePadAdded事件中使用Dispatch Timers和async循环的例子。在Win32应用程序中,我会在WinMain更新/消息循环中处理输入,但在UWP应用程序中我不知道任何类似的东西。
UWP应用程序中是否存在应该像在Win32应用程序中那样收集/处理输入的循环?从输入设备(名义上是Xbox One控制器)轮询输入的推荐协议是什么?
我很高兴阅读有关UWP应用程序开发的更多信息,但我不确定任何引用此类内容的指南。
编辑:如果你没有贬低和继续前进,那么你会分享为什么这个问题值得进行投票的想法。
答案 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);
}
}