[gelöst] SDLK_ Pfeiltasten werden nicht erkannt?



  • Hi,

    wie ich eben feststellen musste werden bei mir unter MacOSX die Pfeiltasten auf der Tastatur nicht von meinem Code erkannt. Eigentlich sollte bei erkennen von SDL_KEYDOWN überprüft werden welche Taste gedrückt wurde und bei SDLK_UP sollte der Wert einer Variable erhöht werden welche meinen Testwürfel dann schneller Rotieren lassen sollte. Funktioniert nur leider nicht. SDLK_a aber klappt ohne Probleme. Es liegt also definitiv an den Pfeiltasten, übrigens egal welche. Sachen wir PageUp und so funktionieren leider ebenfalls nicht. Muss man da speziell erst etwas im Code aktivieren? Mir scheint's so als ob er nur die Grundtastatur erkennt. Nummernblock klappt ebenfalls nicht. Auch SDLK_DOLLAR bzw die anderen Sonderzeichen gehen nicht. Wenn ich aber Shift und 4 (für Dollar) manuell abfrage dann klappts.

    Da ich nur MacOS als Betriebssystem nutze kann ich auch momentan nicht sagen ob's ein reines Apple Problem ist oder generell. Wobei ich eh davon ausgehe das ich da noch irgendwas aktivieren muss damit der einfach die ganze Tastatur kennt. 🙂

    [EDIT]
    Ich habe bis jetzt rausgefunden das die Anwendung definitiv ein KEYDOWN Event bekommt. Habe jetzt einfach mal das ganze so geändert das er direkt bei irgend einem KEYDOWN Event die Geschwindigkeit erhöht. Das Funktioniert auch prima wenn ich die Pfeiltasten betätige, oder jede andere halt. Aber die Abfrage welche Taste speziell bringt mich irgendwie nicht weiter. SDLK_a - z funktionieren, Ziffern auch alles, aber Nummernblock, Pfeiltasten und Einf./Entf. Block bringt mir kein Ergebnis. 😞



  • In was für ne variable hast Du den Tastendruck abgespeichert? Wie fragst Du das ab?
    Ohne Code kann ich nur raten..

    m_keyEvent(evt.key.keysym.sym, true);
    

    Ich frags so ab. Hatte das Problem auch, weil der erste Parameter von keyEvent ein char war. Die SDLK_* brauchen aber ein int, weil du sonst aus dem Wertebereich läufst. Passt auch zu dem beschriebenen Problem.
    Aber wie gesagt. Code zeigen pls.
    lg



  • Ok, ich versuch's mal grad knapp zu halten, also...

    Bei jedem durchlauf des MainLoops wird "EventHandler()" aufgrufen:

    void EventHandler()
    {
    	while( SDL_PollEvent( &Event))
    	{
    		switch( Event.type)
    		{
    			// Taste gedrückt:
    			case SDL_KEYDOWN:
    				EventKeyHandler( Event.key.keysym.sym);
    				break;
    			/*
    			Andere Events...
    			*/
    		}
    	}
    }
    

    Und die Funktion die dann das KEYDOWN verwaltet:

    void EventKeyHandler( char key)
    {
    	if( key == SDLK_a)
    		xrot += 0.25; // erhöht die Rotationsgeschwindigkeit des Würfels um die X-Achse
    	if( key == SDLK_UP)
    		xrot += 0.25; // funktioniert nicht, Rotationsgeschwindigkeit bleibt gleich :(
    }
    

    Ich glaub eh bin einfach nur blind... 😉

    Gruß Daniel



  • insanity schrieb:

    Ok, ich versuch's mal grad knapp zu halten, also...

    Bei jedem durchlauf des MainLoops wird "EventHandler()" aufgrufen:

    void EventHandler()
    {
    	while( SDL_PollEvent( &Event))
    	{
    		switch( Event.type)
    		{
    			// Taste gedrückt:
    			case SDL_KEYDOWN:
    				EventKeyHandler( Event.key.keysym.sym);
    				break;
    			/*
    			Andere Events...
    			*/
    		}
    	}
    }
    

    Und die Funktion die dann das KEYDOWN verwaltet:

    void EventKeyHandler( char key)
    {
    	if( key == SDLK_a)
    		xrot += 0.25; // erhöht die Rotationsgeschwindigkeit des Würfels um die X-Achse
    	if( key == SDLK_UP)
    		xrot += 0.25; // funktioniert nicht, Rotationsgeschwindigkeit bleibt gleich :(
    }
    

    Ich glaub eh bin einfach nur blind... 😉

    Gruß Daniel

    Wie ich sagte, darf kein char sein! Schau Dir mal die SDLKeys an, also das struct. Die laufen aus dem Bereich bis 255 raus... int und dein problem is gelöst.
    lg



  • Ok ich kanns heute zwar nicht mehr testen aber was du sagst macht auf jedenfall Sinn. 😃 Ich werd dann morgen nochmal kurz schreiben ob's denn funktioniert hat, wovon ich dann jetzt aber auch einfach mal ausgehe. 🙂



  • Warum hat der Eventhandler fuer Keys als Parameter ein char und kein Key? Das ist doch dumm. Du willst doch keine chars handeln, sondern Keyevents. Schaut man in die SDL_keysym.h so stellt man fest, dass SDLK_UP = 273 ist. Ist wohl groesser als die 255, die ein char liefern kann.



  • insanity schrieb:

    Ok ich kanns heute zwar nicht mehr testen aber was du sagst macht auf jedenfall Sinn. 😃 Ich werd dann morgen nochmal kurz schreiben ob's denn funktioniert hat, wovon ich dann jetzt aber auch einfach mal ausgehe. 🙂

    Funktioniert! Danke 🙂

    knivil schrieb:

    Warum hat der Eventhandler fuer Keys als Parameter ein char und kein Key? Das ist doch dumm. Du willst doch keine chars handeln, sondern Keyevents. Schaut man in die SDL_keysym.h so stellt man fest, dass SDLK_UP = 273 ist. Ist wohl groesser als die 255, die ein char liefern kann.

    Tja, wenn ich dir darauf eine Antwort geben könnte. *gg* Bin ja noch ganz frisch auf dem Gebiet (nicht nur SDL sondern C++ und OpenGL allgemein, 2 Wochen oder wie lang ich mich jetzt intensiv damit beschäftige in meiner Freizeit... *gg*) und hab da wohl noch was nicht ganz kapiert gehabt... 😉 Mein Gedanke war wohl → SDLK_* ← ist eine Zeichenfolge also müsste ich char nehmen... 🙄 Aber jetzt funktioniert's ja dank euch. 🙂 Danke noch mal!


Log in to reply