C 中的 T-Flip Flop - 如何压缩

T-Flip Flop in C - How to compact

人字拖的乐趣

一段时间以来,我一直在尝试用 c 语言的游戏手柄编写一些功能。当按下游戏手柄上的按钮时,调用 vexRT[Btn4D](“4D”仅表示向下方向的第四组按钮)将 return 为真或假。 如果你有一个布尔值,比如 x,并且你想通过单击并释放按钮来打开 'x' 并让它保持打开状态,则没有简单的 method/function 预定义。 所以我花了一些时间想出了一个简单的触发器,可以在这里看到:

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 个按钮,我希望它们每个都有自己的 'flip' 功能。我可以简单地将代码复制八次,创建一个新变量,例如 x2 和 counter2,但这似乎是多余的。我尝试制作一种可以缩短总代码的方法,但我知道它不起作用。无论如何,它在这里:

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

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

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

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

x = !x

因为它会在按住按钮时不断被调用;释放时 x 的值基本上是 'random' 。 y 在那里充当 'wait until key release',因为没有本机键 pressed/key 按下检测方法。

每个按钮需要两条信息。

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

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

您需要第二种触发器状态,以便在看到边缘时切换状态。

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

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

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