Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Нажатие клавиши в XNA (http://forum.oszone.net/showthread.php?t=244665)

xNiSSaNx 15-10-2012 00:21 2005471

Нажатие клавиши в XNA
 
Как я понял, в 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 2005525

Сделайте сами обработчик IsKeyPressed

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

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

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

a1i1uyamax 23-05-2018 07:10 2814997

Я, конечно, понимаю, что лет так на 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'ом это дело не работает.


Время: 09:30.

Время: 09:30.
© OSzone.net 2001-