Autor Wątek: [SOLVED] [SDL2] Problem z przetwarzaniem zdarzeń klawiatury  (Przeczytany 1610 razy)

Offline wonderboy

  • Użytkownik

# Styczeń 15, 2014, 17:58:22
Próbuję wykryć wyłącznie zdarzenia wcisnięcia i puszczenia klawiszy, bez sprawdzania stanu.

W tym celu używam funkcji SDL_PollEvent() oraz unii SDL_Event, w której sprawdzam czy pole "type" to SDL_KEYDOWN lub SDL_KEYUP.
http://wiki.libsdl.org/SDL_PollEvent
http://wiki.libsdl.org/SDL_Event

Dokumentacja SDL_KeyboardEvent mówi:
Cytuj
An SDL_KEYDOWN or SDL_KEYUP event occurs whenever a user presses or releases a button on a keyboard.
http://wiki.libsdl.org/SDL_KeyboardEvent

Jeśli dobrze rozumiem, oznacza to, że wciśnięty klawisz zostanie wykryty tylko raz, jednak u mnie w każdej pętli wykryte jest to samo zdarzenie wciśniętego klawisza.

Oto prosty kod:
#include <iostream>
#include <SDL2/SDL.h>

int main ( int argc, char *argv[] )
{
    SDL_Init ( SDL_INIT_EVERYTHING );
    SDL_Window* screen = SDL_CreateWindow ( "SDL", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 320, 240, SDL_WINDOW_SHOWN );
    SDL_CreateRenderer ( screen, -1, SDL_RENDERER_ACCELERATED );

    SDL_Event event;
    bool quit = false;
    unsigned int lastTime = 0, currentTime = 0;

    while ( !quit )
    {
        currentTime = SDL_GetTicks();
        if ( currentTime > lastTime + 30 )
        {
            lastTime = currentTime;
            while ( SDL_PollEvent ( &event ) )
            {
                if ( event.type == SDL_KEYDOWN  )
                {
                    std::cout << "KEY PRESSED, type=" << event.type << ", timestamp=" << event.key.timestamp << std::endl;
                }
                else if ( event.type == SDL_QUIT )
                {
                    quit = true;
                }
            }
        }
    }
}

A oto przykładowy wynik (przytrzymanie klawisza i puszczenie po chwili):
KEY PRESSED, type=768, timestamp=2120
KEY PRESSED, type=768, timestamp=2368
KEY PRESSED, type=768, timestamp=2399
KEY PRESSED, type=768, timestamp=2430
KEY PRESSED, type=768, timestamp=2461
KEY PRESSED, type=768, timestamp=2523
KEY PRESSED, type=768, timestamp=2554
KEY PRESSED, type=768, timestamp=2585
KEY PRESSED, type=768, timestamp=2616
KEY PRESSED, type=768, timestamp=2647
KEY PRESSED, type=768, timestamp=2678
KEY PRESSED, type=768, timestamp=2709
KEY PRESSED, type=768, timestamp=2740
KEY PRESSED, type=768, timestamp=2771
KEY PRESSED, type=768, timestamp=2802
KEY PRESSED, type=768, timestamp=2833

Zastanawiam się gdzie tu leży błąd.
« Ostatnia zmiana: Styczeń 15, 2014, 19:06:28 wysłana przez wonderboy »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Xender

  • Użytkownik

  • +2
# Styczeń 15, 2014, 18:30:50
Cytuj
Uint8   repeat   non-zero if this is a key repeat

Offline wonderboy

  • Użytkownik

# Styczeń 15, 2014, 19:01:11
Przeoczyłem to:) Wielkie dzięki.

EDIT: Kod przerabiałem z SDL1.2 gdzie chyba nie było pola "repeat":
typedef struct{
  Uint8 type;
  Uint8 state;
  SDL_keysym keysym;
} SDL_KeyboardEvent;
http://sdl.beuc.net/sdl.wiki/SDL_KeyboardEvent
« Ostatnia zmiana: Styczeń 15, 2014, 19:15:17 wysłana przez wonderboy »