Я пытаюсь сделать программу экранной клавиатуры, в которой, когда я нажимаю данную клавишу, изображение на экране появляется на экране, но я обнаружил, что когда я нажимал A, B, C и D вообще на клавиатуре, только A, B и C. Когда я пытался нажимать клавиши в другом порядке, всегда было одно письмо, которое не отображалось. Ничего, что я нашел онлайн, не ответил на мой вопрос. Мой код (на данный момент я обнаружил только A, B, C и D):
Uint8 *key = SDL_GetKeyState(NULL);
SDL_Surface *alphabet = SDL_LoadBMP("keys/letters/alphabet.bmp");
SDL_Rect A;
A.x = 150;
A.y = 156;
A.w = 106;
A.h = 123;
SDL_Rect B;
B.x = 322;
B.y = 160;
B.w = 106;
B.h = 123;
SDL_Rect b;
b.x = 110;
SDL_Rect C;
C.x = 525;
C.y = 162;
C.w = 106;
C.h = 123;
SDL_Rect c;
c.x = 220;
SDL_Rect D;
D.x = 735;
D.y = 163;
D.w = 106;
D.h = 123;
SDL_Rect d;
d.x = 330;
while(running == true)
{
SDL_PollEvent(&eventhandler);
if(eventhandler.type == SDL_QUIT)
running = false;
SDL_FillRect(screen,NULL,0xFFFFFF);
if(key[SDLK_a])
SDL_BlitSurface(alphabet,&A,screen,NULL);
if(key[SDLK_b])
SDL_BlitSurface(alphabet,&B,screen,&b);
if(key[SDLK_c])
SDL_BlitSurface(alphabet,&C,screen,&c);
if(key[SDLK_d])
SDL_BlitSurface(alphabet,&D,screen,&d);
SDL_Flip(screen);
}'
Вам нужно запросить свое событие в цикле, потому что с помощью метода, который вы используете, вы получаете только одно событие за кадр, даже если в опросе есть 20 событий, вы просто добавляете последний в каждый кадр.
Подумайте о том, чтобы изменить свой код на этот
SDL_Event evt;
while(SDL_PollEvent(&evt))
{
//event handling here
}
И используя это
Uint8 *key = SDL_GetKeyState(NULL);
Вам нужно получить кайаст в каждом кадре... Не только в начале. Для обновления массива необходимо использовать SDL_PumpEvents. Попытка PumpEvents должна быть вызвана PollEvent. Но я нашел цикл с PollEvent лучшим решением, чем использование массива KeyboardState.
Я вполне уверен, что это связано с аппаратным программным обеспечением, клавиатура просто не получит больше ввода, чем в одно время. Вместо использования keystates вы можете использовать SDL_Event и включить/выключить bools в программе для управления каждой текстурой кнопок.