LINUX.ORG.RU

Одноразовая обработка клавиши

 ,


1

2

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

int keys[SDL_NUM_SCANCODES];

int main(int argc, char *argv[]){

    for (int i = 0; i < SDL_NUM_SCANCODES; i++){
        keys[i] = 0;
    }

	*******************

	while(run){

        CheckEvent(run, xrf, yrf);

        if (keys[SDL_SCANCODE_ESCAPE]) run = false;

        if (keys[SDL_SCANCODE_W]) gty += 0.01;
        if (keys[SDL_SCANCODE_A]) gtx -= 0.01;
        if (keys[SDL_SCANCODE_S]) gty -= 0.01;
        if (keys[SDL_SCANCODE_D]) gtx += 0.01;

        if (keys[SDL_SCANCODE_KP_PLUS]) gtz += 0.02;
        if (keys[SDL_SCANCODE_KP_MINUS]) gtz -= 0.02;

        if (keys[SDL_SCANCODE_R] && keys[SDL_SCANCODE_LSHIFT]) {
            gtx = 0, gty = 0, gtz = -2.0;
        }

		*******************

	}

	*******************
}
void CheckEvent(bool &run, float &xrf, float &yrf){

    SDL_Event event;

    while ( SDL_PollEvent(&event) ){

        switch(event.type){

            case SDL_KEYDOWN:{
                keys[event.key.keysym.scancode] = 1;
                break;
            }

            case SDL_KEYUP:{
                keys[event.key.keysym.scancode] = 0;
                break;
            }

        }

    }


Последнее исправление: mysql_connect (всего исправлений: 4)

http://stackoverflow.com/a/27084554/2128769

When handling a keyboard event, just filter out any events that are repeat events, i.e. check the repeat field of the SDL_KeyboardEvent of the SDL_Event union.

For example:

SDL_Event event;
while (SDL_PollEvent(&event)) {
  if (event.type == SDL_QUIT) {
    quit = true;
  }
  if (event.type == SDL_KEYDOWN && event.key.repeat == 0) {
    if (event.key.keysym.sym == SDLK_d)
      debug = debug ? false : true;
    // ... handle other keys
  }
}
E ★★★
()
Ответ на: комментарий от E

Видел, пробовал, работает. Мне бы вот это вынести бы в main так же как и сейчас это сделано. И еще этим способом одновременного нажатие клавиш не работает.

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

Зачем выносить в main? Не надо ничего выносить в main(), я бы вообще сделал ещё одну функцию, потому что бывают другие main-ы, типа WinMain и всего такого.

А так вон, в свой CheckEvent() засунуть и норм.

case SDL_KEYDOWN: 
if( event.key.repeat == 0 ) 
{
// first event
}
else
{
// other events
}
break;

Извиняюсь, что без отступов и всего такого, просто прикинул.

a1batross ★★★★★
()
for (int i = 0; i < SDL_NUM_SCANCODES; i++){
        keys[i] = 0;
}

Зачем, если глобалки всегда инициируются в нуль?

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

Сделай отдельные обработчики для клавиш, которые должны нажиматься 1 раз - в CheckEvent, и для клавиш, которые должны быть постоянно нажаты для действия - это твой массив скан-кодов.

Грубо говоря,

if event = KEYDOWN:
   if key is continous:
       scancodes += key
   else if repeat = 0:
       generate_some_one_time_action(key)

E ★★★
()

Все правильно. Или включайте повтор (нежелательно), или возводите флаг нажатой кнопки.

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