我正在尝试使用游戏手柄来控制应用程序。它不是游戏,只是使用Windows Forms的普通应用程序。所以它没有游戏循环/更新过程或类似的东西。我不想使用XNA,因为我认为捕获按钮是一个巨大的过载。
我正在尝试使用SlimDX和SharpDX。据我了解,它们只是DirectX的包装器,对吧?
查看文档,似乎没有按下按钮的事件。所以我一直在寻找替代方案。我尝试添加一个计时器(来自 System.Windows.Forms.Timer 类),并读取游戏手柄的状态,如下所示:
private void timer_tick(object sender, EventArgs e)
{
State s = controller.GetState();
stateLabel.Text = s.Gamepad.Buttons == GamepadButtonFlags.A ? "A" : "";
}
在计时器滴答之间有足够小的间隔(我使用10ms),我可以看到按钮是否被按下。但是,如果按下按钮,我不想多次按下按钮 - 我需要确保在再次按下按钮之前已经释放按钮。在计时器的两个刻度之间,我不知道是否按下了两次按钮,或者它是否被按下了。
我考虑过在控制器状态下使用数据包编号,但它会在模拟摇杆或肩部触发器上轻微触摸时发生变化。
帮助?
答案 0 :(得分:2)
从几十次阅读你的问题后我可以收集到的是,你只想按一下按钮直到它被释放。您可能应该使用数据包编号技术来跟踪对其他输入的任何更改。
要从按下按钮获得单个输入而不是获得连续输入(1而不是11111111 ......等),请创建旧状态和当前状态。然后将旧状态与新状态进行比较。
这样的事情:
class Input
{
State old;
void GetInput()
{
State new = controller.GetState();
if (this.old.GamePad.Buttons == GamepadButtonFlags.A && new.GamePad.Buttons == GamepadButtonFlags.A)
{
// Do stuff that will be called only once.
}
this.old = new;
}
}