【问题标题】:Algorithm to toggle a variable but the input is continuous切换变量但输入是连续的算法
【发布时间】:2020-12-11 05:59:07
【问题描述】:

我正在制作一个从 xbox 控制器读取输入的程序,并且我在代码中有一些需要切换的布尔变量。我的函数有这个模板。

void toggle(bool condition, bool &variable) // Used to toggle variables
{
}

条件参数将是控制器上的一个按钮(例如 buttonA),而 variable 参数是对需要切换的变量的引用(例如蹲下)

问题在于,由于控制器输入不断被读取,玩家无法足够快地按下和释放按钮,以至于它不会被多次读取,这导致我试图切换的变量只是快速来回切换.我想要的行为是,当按下 A 时,蹲下的值会变为与它相反的值(蹲下 = !蹲下)但我只希望它在按下按钮时运行一次并等待它被释放在再次调用该函数之前。我已经尝试过,但我想不出一个算法来做到这一点。任何帮助表示赞赏!

【问题讨论】:

  • 如果可以的话,为什么在释放按钮而不是按下按钮时不调用此函数?
  • 另一种方法是感知按钮值的变化以及按钮值的位置。您显然希望对特定的按钮转换做出反应,而不仅仅是按钮位置。
  • 准备好处理contact chatter问题。

标签: c++ xbox


【解决方案1】:

这是 RAW 输入的常见问题。这就是操作系统提供各种类型的事件及其处理程序的原因。一个例子是WM_KEYDOWNhere
如果原始输入是唯一的选择,您可以使用中间过滤器,其结果可用于实际切换您的情况下的变量。

例如,如果r,P 代表按钮的释放和按下状态,那么像 rrrrrrrrrrrrrrPPPPrrrrrrrrrrrPPrrrrrrrrrrrr 这样的序列意味着您需要在r -> P 转换发生时切换它。可能你可以有一个只有 2 个元素的数组,你可以这样做 样本[1]=样本[0];样本[0]=控制.状态; if(sample[0]=='r' && sample[1]='P') then toogle(变量)

此外,您可以尝试使用更大的阵列来避免任何杂散噪声,基本上采用基于最短人工按键持续时间和未输入采样率的阈值。

【讨论】:

  • 为什么要麻烦一个数组,而以前的'r'状态的简单计数器会做......
  • @IgorG,这是主观的和基于需求的。可能存在想要避免意外按下的用例,或者可能是长按按钮的手势。
猜你喜欢
  • 2017-09-26
  • 2021-05-06
  • 2021-02-03
  • 2019-10-05
  • 1970-01-01
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
  • 2011-07-14
相关资源
最近更新 更多