0

我正在尝试使用游戏手柄来控制应用程序。这不是一个游戏,只是一个使用 Windows 窗体的普通应用程序。所以它没有游戏循环/更新过程或类似的东西。我不想使用 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" : "";
}

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

我考虑过在控制器状态下使用数据包编号,但只要轻轻触碰模拟摇杆或肩部触发器,它就会改变。

帮助?

4

1 回答 1

2

从我多次阅读您的问题后我可以收集到的是,您只想记录按钮按下 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;
    }
}   
于 2014-03-23T20:18:11.947 回答