T-Flip Flop в C - Как компактировать
Flip Flop Fun
Я пытался закодировать некоторые функции с помощью геймпада в 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--;
Тогда просто, вы можете просто сказать, если (х) или если (! Х) и делать все, что вы хотите сделать.
Проблема в том, что у меня есть 8 кнопок на геймпаде, и я хочу, чтобы у каждой из них была своя способность "переворачивать". Я мог бы просто скопировать код восемь раз, создав новую переменную, такую как x2 и counter2, однако это кажется излишним. Я попытался создать метод, который сократил бы общий код, но я знаю, что он не работает. Вот это все равно:
bool tFlip(bool x) {
bool y = !x;
if (y)
return true;
else
return false;
}
Короче говоря, если кто-нибудь знает, как правильно кодировать эти вещи, я бы хотел знать, как. Я пробовал гуглить, но ничего не могу найти. Благодарю.
TLDR: Кто-нибудь знает, как кодировать триггер?
РЕДАКТИРОВАТЬ: Это все внутри цикла, поэтому я не могу просто сделать
x = !x
как он будет непрерывно вызываться при удержании кнопки; значение х по сути будет "случайным", когда вы отпустите. Y служит для "ожидания до отпускания клавиши", так как нет собственного метода обнаружения нажатой клавиши / нажатия клавиши.
1 ответ
Вам нужно две части информации на кнопку.
- На последнем примере кнопка была вверх или вниз?
- Состояние триггера 0 или 1?
Вам нужно первое состояние кнопки, чтобы обнаружить ребро сверху вниз.
Вам нужно второе состояние триггера, чтобы вы могли переключать состояние, когда видите ребро.
Вы можете представить состояние для восьми кнопок несколькими способами, например, используя 16 переменных, используя битовый вектор, используя массив struct
s и т. д. Здесь я буду использовать два массива:
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
,
Все это игнорирует удаление кнопок; надеюсь, ваша библиотека геймпада сделает это за вас.