【问题标题】:Reliable way to capture gamepad button press (non-game application)捕获游戏手柄按钮按下的可靠方式(非游戏应用程序)
【发布时间】:2014-03-23 19:30:43
【问题描述】:

我正在尝试使用游戏手柄来控制应用程序。这不是一个游戏,只是一个使用 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 毫秒),我可以看到按钮是否被按下。但是,如果按住按钮,我不想多次按下按钮 - 我需要确保在再次按下按钮之前它已被释放。在计时器的两个滴答声之间,我不知道一个按钮是被按下了两次还是只是被按住了。

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

帮助?

【问题讨论】:

  • 您将此信息提供给什么?类似文本框的东西?
  • 可能是。我实际上是在尝试破解控制器,以便截瘫的人可以用她的嘴操作它,控制器的行为就像鼠标一样。 Something like this 但更针对一般计算机使用而不是游戏。我知道我可以制作一个特殊的鼠标 - 但我有很多备用控制器,我认为我可以用它们做比鼠标更多的事情。
  • 非常崇高的事业。我看看能不能煮点东西让你开始。看起来一些巧妙的 bool 用法可以帮助您入门。

标签: c# .net slimdx sharpdx gamepad


【解决方案1】:

在阅读您的问题几次后我可以收集到的是,您只想记录按钮按下 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;
    }
}   

【讨论】:

  • 像这样比较状态就可以了。我喜欢这种不需要检查数据包编号的策略,因为即使是对摇杆或触发器的最轻微触摸也会生成一个新数据包。非常感谢:)
  • 很高兴我能帮上忙。作为记录,我基于我用于Monogame的一些代码。
猜你喜欢
  • 2020-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-05
  • 1970-01-01
  • 2011-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多