Войти

Показать полную графическую версию : Нажатие клавиши в XNA


xNiSSaNx
15-10-2012, 00:21
Как я понял, в XNA нету обработчика события нажатия клавиши, а задача в том чтобы заданый код выполнялся один раз при нажатии клавиши.
Например если так
if (Keyboard.GetState().IsKeyDown(Keys.L) && !click_l)
i++;

То переменная i увеличится не на +1, а примерно на время залипания клавиши в милисекундах, но как правильным путем добиться нужного результата?
Если
bool click = false; /// Вне метода
/////////////////////////

if (Keyboard.GetState().IsKeyDown(Keys.L) && !click)
{
click = true;

////Код который нужно выполнить, например i++;

}
if (Keyboard.GetState().IsKeyUp(Keys.L)) click = false;


Здесь все работает, а именно при нажатии клавиши i увеличится всего лишь на +1, и так при "едином" надатии.
Но меня волнует то, что в таком случае будет много лишнего кода, и для каждой кнопки делать так будет неправильно. Попытка засунуть этот код в метод не дала результата, так как опять же для коректной работы нужно было для каждого вызова метода объявлять переменную которая отвечала за нажатие. Даже создание отдельного класса и написании переменной как член класса не дало результата.

ferget
15-10-2012, 05:38
Сделайте сами обработчик IsKeyPressed

Создаете класс, там два массива bool Keys[256], OldKeys[256].

Сперва все false, при нажатии кнопки один элемент в массиве Keys становится true, OldKeys=Keys

и на следующем заходе сравниваете, если Keys[i]!=OldKeys[i] значит кнопка была нажата или отпущена

a1i1uyamax
23-05-2018, 07:10
Я, конечно, понимаю, что лет так на 6 опоздал, но всё же.



long escape_key_down = 0; // Вне метода
///////////////////////

if (Keyboard.GetState().IsKeyDown(Keys.Escape))
escape_key_down++;
if (Keyboard.GetState().IsKeyUp(Keys.Escape) && escape_key_down > 0)
{

// TODO: здесь код, который должен был выполняться по нажатию Esc.

escape_key_down = 0;
}


Мало ли кому пригодится, ибо с bool'ом это дело не работает.




© OSzone.net 2001-2012