watkinsr
watkinsr

Reputation: 11

How can I detect when a key has been released (SDL 2.0)

I'm having issues detecting when a key has been released. If I were to call:

csdl_setup->GetMainEvent()->key.keysym.sym == SDLK_UP

SDLK_UP would not be true for around 2-3s which is inefficient for a keyboard driven menu. I want to be able to scroll through my menu easily in SDL.

Can anybody help me?

SDL_Event event;
while (SDL_PollEvent(&event) && event.key.repeat == 0 && some_sprite->GetY() == coords[1] && event.type == SDL_KEYDOWN)
{
    some_sprite->SetY(coords[1] + 20);
}

SDL_PollEvent(&event);
if (event.key.repeat == 0 && some_sprite->GetY() == coords[3])
{

    if(some_sprite->GetY() == coords[3] && event.type == SDL_KEYDOWN)
    {
        some_sprite->SetY(coords[3] + 20);
    }
    cout << "Event Key Repeat = " << event.key.repeat << endl;

}

Upvotes: 0

Views: 1763

Answers (1)

Jonny D
Jonny D

Reputation: 2344

You should be handling events as they come. Your code uses multiple calls to SDL_PollEvent() and even short-circuits the polling in some cases.

Move all of your event handling code into the while loop. Remove the additional checks on the while loop so you stay in the loop until all events are processed.

A quick modification of your code might look something like this:

SDL_Event event;
while (SDL_PollEvent(&event))
{
    if(event.type == SDL_KEYDOWN)
    {
        if(event.key.repeat == 0)
        {
            if(some_sprite->GetY() == coords[1])
                some_sprite->SetY(coords[1] + 20);
            else if(some_sprite->GetY() == coords[3])
                some_sprite->SetY(coords[3] + 20);
        }
        cout << "Event Key Repeat = " << event.key.repeat << endl;
    }
}

Upvotes: 2

Related Questions