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 按下检测方法。
每个按钮需要两条信息。
- 在上一个示例中,按钮是向上还是向下?
- 触发器的状态是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
。
所有这些都忽略了按钮的去抖动;希望您的游戏手柄库能为您做到这一点。
人字拖的乐趣
一段时间以来,我一直在尝试用 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 按下检测方法。
每个按钮需要两条信息。
- 在上一个示例中,按钮是向上还是向下?
- 触发器的状态是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
。
所有这些都忽略了按钮的去抖动;希望您的游戏手柄库能为您做到这一点。