【问题标题】:C# + SlimDX / XInput - how to poll when button is pressed?C# + SlimDX / XInput - 按下按钮时如何轮询?
【发布时间】:2015-07-23 05:32:01
【问题描述】:

我需要与 Xbox 360 控制器交互,而我有限的知识让我无法使用 C#。我不想为这个简单的事情使用 XNA(并要求用户安装它),所以我使用 SlimDX 来允许我与 XInput 交互。我已经能够检测到所有按钮按下并且小程序正在出现......但我需要知道如何轮询/知道何时按下按钮,然后触发事件。

现在我有一个运行时间为 10 毫秒的计时器,它会检查哪些按钮被按下并据此运行。但是假设您按下 X 一秒钟 = 它检测到 X 被“按下”了 100 次,因为每隔 10 毫秒,X 被按下。我只想在按下按钮时触发我的事件,而不必依赖计时器。

在 C# 上可以使用 SlimDX 吗?如果是这样,怎么做?如果没有,是否有更好/更低延迟的 C# XInput 包装器可以满足我的需要?

提前致谢!

【问题讨论】:

    标签: c# xna slimdx xinput


    【解决方案1】:

    创建两个变量来存储按钮在轮询之间的状态。

    bool curretButtonState;//pressed == true
    bool previousButtonState;
    
    //poll each 10ms
    void CheckInput()
    {
      currentButtonState = pollResult;
    
      if(currentButtonState == true && previousButtonState == false)
      {
        //button just pressed, call code
      }
      if(currentButtonState== false && previousButtonState == true)//additional functionality if desired
      {
        //button just released, call other code
      }
    
     previousButtonState = currentButtonState;
    }
    

    假设它检测到按钮按下并运行您的相应代码,然后在下一次轮询(10 毫秒)时,由于之前的状态被切换为 true,并且按钮仍然被按下,那么这两个状态都将为 true,并且它不会第二次运行代码。在释放并重新按下按钮之前,第一个 if 语句不会再次为真。

    【讨论】:

    • 感谢您的建议。我就是这样开始的,但是看起来很麻烦。当然有一种方法可以订阅按钮按下事件或类似事件,这样我的代码就会在按下按钮时被触发,而不是由计时器触发?
    • 提及按钮触发正在播放的声音样本可能会有所帮助。因此,如果用户快速按下按钮,样本将以该速度重复播放。有一个计时器会打破这一点,因为它不会在用户按下时触发,事情必须在用户按下和计时器检查时重合。那里的计时器并不是一个优雅的解决方案:-(
    • 我做了更多研究,发现其他人建议将此作为解决方案。就我而言,我正在与游戏鼓交互,唯一可以按住的两个“按钮”是底鼓踏板,所以我使用了你的建议,效果不错。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多