2016-08-08 21 views
0

Ich versuche, den Status der Shift-Tasten direkt nach der Initialisierung von SDL zu lesen und die Fenster zu erstellen, das heißt, ich möchte erkennen, ob die Shift-Taste beim Starten der Anwendung gedrückt wird.SDL kann die Verschiebung nicht lesen, wenn vor der Initialisierung eine Schlüsselabschaltung stattgefunden hat, Umgehung?

Aber obwohl ich die App mit gedrückter Shift ausführen, erkennt es die Tasten nicht.

Wenn ich den gleichen Code in der Hauptschleife hinzufügen, und ich beginne Shift drücken nach das Programm gestartet läuft, dann ist es um den Zustand richtig liest, also denke ich intern SDL erkennt nur die Tasten gedrückt werden, wenn die Taste down Ereignis ist aufgetreten, während SDL ausgeführt wurde.

Könnte es einen Betriebssystem-unabhängigen Umgang damit geben? Ich benutze übrigens MacOS, möchte aber, dass dieses Projekt so Betriebssystem-unabhängig wie möglich ist.

// Added either of these but didn't help: 
// SDL_PumpEvents(); 
// SDL_Event event; // while(SDL_PollEvent(&event)); 

const Uint8 *keys = SDL_GetKeyboardState(NULL); 
if(! keys[SDL_SCANCODE_LSHIFT] and ! keys[SDL_SCANCODE_RSHIFT]) { 
    printf("Booted without shift."); 
} 
else { 
    printf("Booted pressing shift."); 
} 

Antwort

1

SDL stützt sich auf Ereignisverarbeitung, um das Tastaturstatusarray aufzufüllen. Vom documentation:

Hinweis: Diese Funktion gibt Ihnen den aktuellen Zustand, nachdem alle Ereignisse verarbeitet worden sind, so dass, wenn eine Taste oder eine Taste gedrückt wurde und freigegeben, bevor Sie Ereignisse verarbeiten, dann wird der Presszustand zeigt nie auf in den SDL_GetKeyboardState() Aufrufen.

Das bedeutet, dass Sie es für jede Plattform implementieren müssen Sie jedoch unterstützen wollen, die nicht zu schwer sein sollte:

bool shift_pressed(void) 
{ 
#ifdef WINDOWS 
    return GetKeyState(VK_SHIFT) & 0x8000 
#else 
    // Implement for other OS as needed 
    return false; 
#endif   
}