0

触发器乐趣

一段时间以来,我一直在尝试使用 c 中的游戏手柄编写一些功能。当按下游戏手柄上的按钮时,调用vexRT[Btn4D](“4D”仅表示向下方向的第四组按钮)将返回 true 或 false。如果您有一个布尔值,比如 x,并且您想通过单次按下和释放按钮来打开“x”并让它保持打开状态,那么没有预定义的简单方法/功能。所以我花了一些时间想出了一个简单的触发器,可以在这里看到:

if (vexRT[Btn7D]) {
        if (y)
            x = false;
        else
            x = true;
    }
    else if (counter == 0) {
        counter = 25;
        if (x)
            y = true;
        else
            y = false;
    }
    else
        counter--;

然后简单地说,你可以只说 if (x) 或 if (!x) 并做任何你想做的事情。

问题是我在游戏板上有 8 个按钮,我希望它们每个都有自己的“翻转”能力。我可以简单地复制代码八次,创建一个新变量,例如 x2 和 counter2,但这似乎是多余的。我尝试制作一种可以缩短总代码的方法,但我知道它不起作用。无论如何,这里是:

bool tFlip(bool x) {
bool y = !x;
if (y)
    return true;
else
    return false;
}

长话短说,如果有人知道如何正确编码这些东西,我很想知道。我试过谷歌搜索,但我找不到任何东西。谢谢。

TLDR:有人知道如何编写触发器吗?

编辑:这都在一个循环中,所以我不能简单地做

x = !x

因为按下按钮时会不断调用它;当您释放时,x 的值基本上是“随机的”。y 在那里充当“等到按键释放”,因为没有本机按键/按键检测方法。

4

1 回答 1

0

每个按钮需要两条信息。

  1. 在上一个示例中,按钮是向上还是向下?
  2. 触发器的状态是 0 还是 1?

您需要第一个按钮状态来检测从上到下的边缘。

您需要第二个触发器状态,因此您可以在看到边缘时切换状态。

您可以通过多种方式表示八个按钮的状态,例如,使用 16 个变量、使用位向量、使用structs 数组等。这里我将使用两个数组:

bool button[8];
bool flipflop[8];

您还需要将每个人字拖与游戏手柄按钮相关联。例如,

int btnID[8] = { ..., Btn4D, ...};

您需要将 替换为...您感兴趣的游戏手柄按钮。

现在,每毫秒,做这个

#define DOWN (0)  /* as appropriate for your gamepad */

for (i = 0; i < 8, i++)
{
    if (button[i] != vexRT[btnID[i]])
    {
        button[i] = !button[i];
        if (button[i] == DOWN) /* edge */ flipflop[i] = !flipflop[i];
    }
}

要获得触发器状态,只需读取flipflop[n]感兴趣的按钮,n.

所有这些都忽略了按钮的去抖动;希望您的游戏手柄库为您做到这一点。

于 2015-11-19T21:05:14.963 回答