LINUX.ORG.RU

Автоповтор KeyRelease


0

0

Можно ли как-то отключить, и оставить только для KeyPress?

Смотрел XAutoRepeatOff, но увы этот способ отключает автоповтор нажатия клавиш вообще и для конкретного экрана.

★★★★

В общем обошелся workaround'ом для своих целей, подсчитывая вызовы KeyPress/KeyRelease. В случаи когда после KeyRelease сразу приходит KeyPress - произошел автоповтор нажатия клавиши.

Andru ★★★★
() автор топика
Ответ на: комментарий от andreyu

нужно было получать событие нажатия клавиши функцией вида bool key_Press( int KeyCode ), и при следующих итерациях цикла приложения - возвращать false, до того момента, пока не сработает KeyRelease. Т.е.

void mainLoop(void)
{
  if ( key_Press( K_SPACE ) )
    {
      // some code
    }
}

если в данном случаи юзер зажимал пробел, то условие постоянно срабатывало учитывая внутреннюю организацию в движке.

Andru ★★★★
() автор топика
Ответ на: комментарий от Andru

Грубая схема моего движка:

// one time initialization
bool keys0[number_of_keys];
bool keys1[number_of_keys];
memset(keys0, 0, number_of_keys);
memset(keys1, 0, number_of_keys);

void update() {
   // engine code
   if(key_pressed(key_code)) {
      keys0[key_code] = true;
      keys1[key_code] = true;
   }

   if(key_released(key_code)) {
      keys1[key_code] = true;
   }

   // your game code here
   // keys0[] == true ? foo() : bar()
   // keys1[] == true ? foo() : bar()

   // another engine code
   memset(keys0, 0, number_of_keys); 
}

Не оно?

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

тут false, конечно ;)

if(key_released(key_code)) {
   keys1[key_code] = false;
}

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

Если key_pressed и key_released возвращают последние состояния событий KeyPress/KeyRelease, то:

- keys0 при автоповторе всегда будет содержать true для нажатой клавиши
- keys1 при автоповторе всегда будет содержать false для нажатой клавиши

А так да, keys0[] содержали бы нужное мне значение(с учетом того, что в конце массив сбрасывался). В общем проблему я решил, и думаю можно её не обсуждать, хотя сперва нагородил длинный пост... но посмотрел, уж сильно много всего, и потер :)

Andru ★★★★
() автор топика
Ответ на: комментарий от Andru

keys0[] в моем случае будет содержать true только при нажатии на клавишу. При ее удержании в keys0[] ничего не изменяется. Это удобно. К примеру пользователь нажал и удерживает ESC, в игре обработчик вызовется только один раз.

В случае с keys1[] обработчик будет вызываться до тех пор, пока клавиша не будет отпущена.

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

>> keys0[] в моем случае будет содержать true только при нажатии на клавишу.

Тогда key_pressed вряд ли возвращают последнее состояние события KeyPressed(т.к. при удержании оное постоянно срабатывает), либо я не так уловил суть mainLoop'а в коде выше. Хотя, ваш движок на SDL основан? :) Возможно тамошние функции уже организовывают все как надо.

>> нажал и удерживает ESC, в игре обработчик вызовется только один раз.

мне как раз это и нужно было, чего собственно и сделал :)

Andru ★★★★
() автор топика
Ответ на: комментарий от Andru

> >> keys0[] в моем случае будет содержать true только при нажатии на клавишу.
> Тогда key_pressed вряд ли возвращают последнее состояние события KeyPressed(т.к. при удержании оное постоянно срабатывает), либо я не так уловил суть mainLoop'а в коде выше. Хотя, ваш движок на SDL основан? :) Возможно тамошние функции уже организовывают все как надо.


В данном случае repeat при зажатой клавише не работает.
Да, движок пока сильно привязан к SDL (SDL, SDL_image, SDL_mixer). В планах полный уход от SDL в пользу opengl + glut, devil, openal. Но не до этого сейчас, приоритет на портирование движка под iPhone.

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

>> В планах полный уход от SDL в пользу opengl + glut, devil, openal.

Когда создание игрушек является коммерческой деятельностью, то да, главное цель, а не средства. Для меня это просто фан :)

>> Но не до этого сейчас, приоритет на портирование движка под iPhone.

Всех так и манит новый рынок :) Охота было с этим побаловаться(хотя бы в эмуляторе для начала), но недоступная простым смертным лицензия и пр. как-то убили все желание(к тому же с FreePascal под iPhone не совсем все понятно), так и ограничился изучением внутренностей MacOS X.

Andru ★★★★
() автор топика
Ответ на: комментарий от Andru

> >> В планах полный уход от SDL в пользу opengl + glut, devil, openal.
> Когда создание игрушек является коммерческой деятельностью, то да, главное цель, а не средства. Для меня это просто фан :)


Для меня это всю жизнь было фаном. Просто от него есть еще и материальный профит ;)

> >> Но не до этого сейчас, приоритет на портирование движка под iPhone.

> Всех так и манит новый рынок :) Охота было с этим побаловаться(хотя бы в эмуляторе для начала), но недоступная простым смертным лицензия и пр. как-то убили все желание(к тому же с FreePascal под iPhone не совсем все понятно), так и ограничился изучением внутренностей MacOS X.


Да мне вообще всегда было интересно писать под разные платформы - Mophun, Pocket PC / Windows Mobile, Power TV, etc.
Ну а в случае с iPhone особых телодвижений и не нужно ;)

Кстати, лицензия для побаловаться не нужна. И стоимость лицензии в районе 100 баксов за продукт - фигня. Тот же BASS стоит столько же ;)

Про паскаль ничего не знаю, но думаю для вас не составит труда изучить c/c++

andreyu ★★★★★
()
Ответ на: комментарий от Andru

> Всех так и манит новый рынок :)

Кстати, рынок далеко не новый. Заработать там не легко, как расписывает Apple и книги типа "лям баксов за месяц".

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

>> Про паскаль ничего не знаю, но думаю для вас не составит труда изучить c/c++

Дело в готовой базе кода, а не в языке :) Для C/C++ мне придется начинать все чуть ли не с нуля, пускай это будет и переводом уже готового на новый язык, но фана в этом никакого не вижу... так и остаюсь принципиальным приверженцем Pascal'я :) А компилятор под iPhone есть, но с заголовочными файлами не совсем ясно - разработчики ссылаются на запрет лицензии "чего-то там выкладывать в свбодный доступ", вот и не решил морочиться с этим всем, тем более без наличия настоящего мака или последней версии хакинтоша, чтобы поставить iPhone SDK.

>> Кстати, рынок далеко не новый. Заработать там не легко, как расписывает Apple и книги типа "лям баксов за месяц".

При таком то количестве появившихся заинтересованных лиц и количестве новых продуктов... естественно, что легко вряд ли будет :)

Andru ★★★★
() автор топика
Ответ на: комментарий от andreyu

>> Для меня это всю жизнь было фаном. Просто от него есть еще и материальный профит ;)

Увы, пока мне не удалось так уютно устроится. Так, два года назад был мелкий заработок на недоигрушках, но это не было самоцелью и получилось вообще случайно :)

Andru ★★★★
() автор топика
Ответ на: комментарий от Andru

> > Для меня это всю жизнь было фаном. Просто от него есть еще и материальный профит ;)
> Увы, пока мне не удалось так уютно устроится. Так, два года назад был мелкий заработок на недоигрушках, но это не было самоцелью и получилось вообще случайно :)


Значит время еще не пришло ;)

andreyu ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.