2015-11-19 2 views
0

флип-флоп FunT-флип-флоп в 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; 
} 

Короче говоря, если кто-нибудь знает, как правильно код эти вещи, которые я хотел бы знать, как это сделать. Я пробовал поиск в Google, но ничего не могу найти. Благодарю.

TLDR: Любой знает, как закодировать флип-флоп?

EDIT: Это все внутри цикла, так что я не могу просто сделать

x = !x 

, как он будет постоянно вызываться, когда кнопка удерживается в нажатом положении; значение x будет по существу «случайным» при выпуске. Y должен действовать как «дождаться нажатия клавиши», так как нет встроенного метода нажатия нажатой клавиши.

+0

Что в мире 'counter' и' y' в вашем первом коде? Что не так с 'x = y' и/или' x =! Y', что вы чувствуете необходимость в неуклюжих операторах 'if' /' else'? Вы никогда не слышали о массивах? –

+0

Извините, мне трудно объяснить проблемы, которые появляются в реальной жизни. Счетчик - это всего лишь задержка в 25 миллисекунд, потому что геймпад - это мусор и не может слишком быстро нажимать кнопку. Я не могу этого сделать, потому что все это помещено внутри цикла while. Это означало бы, что каждый миллисекунда значение x переключится. Когда джойстик нажат, ему необходимо один раз переключить значение, а затем не переключаться снова, пока кнопка не будет отпущена и не будет нажата снова. Если бы какой-либо способ обнаружить нажатие клавиши/нажатия клавиши на джойстике, это было бы в тысячу раз проще. –

+0

Итак, чтобы достичь задержки в 25 миллисекунд, вы каким-то образом в другом месте гарантируете, что цикл повторяется ровно один раз за миллисекунду? –

ответ

0

Для каждой кнопки требуется две информации.

  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 только что прочитал flipflop[n] для кнопки интереса, n.

Все это игнорирует деблок кнопок; надеюсь, ваша библиотека геймпада сделает это за вас.

 Смежные вопросы

  • Нет связанных вопросов^_^