可靠的方式捕捉手柄按钮按下(非游戏应用程序)

本文关键字:游戏 应用程序 按钮 方式捕 | 更新日期: 2023-09-27 17:52:38

我正在尝试使用手柄来控制应用程序。这不是一个游戏,只是一个使用Windows窗体的普通应用程序。所以它没有游戏循环/更新过程或类似的东西。我不喜欢使用XNA,因为我认为它只是捕捉一个按钮的按下是一个巨大的过载。

我正在试用SlimDX和SharpDX。据我所知,它们只是DirectX的包装,对吧?

查看文档,似乎没有按钮按下的事件。所以我一直在寻找另一种选择。我已经尝试添加定时器(从System.Windows.Forms)。定时器类),并像这样读取手柄的状态:

private void timer_tick(object sender, EventArgs e)
{
    State s = controller.GetState();
    stateLabel.Text = s.Gamepad.Buttons == GamepadButtonFlags.A ? "A" : "";
}

定时器滴答之间的间隔足够小(我使用10ms),我可以看到按钮是否被按下。然而,我不想处理按钮按多次应该按下按钮-我需要确保它已经释放处理按钮按下之前再次。在计时器的两次滴答声之间,我不知道一个按钮是被按了两次还是只是被按住了。

我考虑过在控制器状态下使用包数,但它会在模拟杆或肩部触发的最轻微触摸上改变。

帮助吗?

可靠的方式捕捉手柄按钮按下(非游戏应用程序)

在阅读了几次您的问题后,我可以收集到的是,您只想记录一个按钮按下1次,直到它被释放。您可能应该使用包数技术来跟踪对其他输入的任何更改。

要从按下的按钮获得单一输入,而不是获得连续输入(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;
    }
}