Pfeiltasten von Tastatur lesen
-
Hi!
Ich möchte in ANSI C die 4 Pfeiltasten von der Tastatur einlesen. Mit der ESC-Taste funktioniert das wunderbar über das ASCII-Zeichen 27:
void KeyboardFunc(unsigned char key, int x, int y) { direction = 0; switch(key) { case 27: // escape key pressed exit(0); break;
Laut der ASCII-Tabelle (http://www.marjorie.de/ps2/scancode-set1.htm) gibt es für die Pfeil-Tasten 2 übertragene Zeichen (bytes). Diese muss man wohl nacheinander abfragen. Oder kann man diese auch auf einmal abfragen?
Die Funktion getch() kann ich leider nicht verwenden, da mein Compiler (Linux) <conio.h> nicht einbinden will. Mit der Methode getchar() funktioniert es leider auch nicht.
Sehe ich das richtig, dass für das Einlesen der linken Pfeiltaste die hintereinander-Abfrage nach 0xE0 und 0x4B die einzige Möglichkeit ist? Falls ja, wie mache ich das am besten mit der vorgegebenen openGL Funktion KeyboardFunc(unsigned char key, int x, int y)? Ich muss mir wohl irgendie merken wieviele Zeichen ich schon gelesen habe und welche Zeichen ich schon gelesen habe. Ist die "gängige" Vorgehensweise wirklich so komplex?
Cheers,
Siegfried
-
getch() müsstest du auch 2 mal hintereinander aufrufen um die zeichen zu erhalten.
So komplex ists dann doch nicht kannst.
Für die Pfeiltasten ist das erste Zeichen immer 0xe0. Somit weist du in deiner Methode bereits ob noch ein zeichen gelesen werden soll oder nicht.Da würd ich mir nix mehr merken, einfach das nächste zeichen untersuchen und es den Pfeilen zuordnen.
Ansonsten falls die Methode dafür 2 mal automatisch aufgerufen wird, brauchst du dir ja auch nur ein zeichen mehr zu merken
-
Das Problem ist gelöst:
Glut bietet eine extra Funktion namens glutSpecialFunc(). Damit lassen sich alle Tasten, die keine ASCII Belegung haben, eindeutig zuordnen. Zum Beispiel:
//... void SpecialFunc( int key, int x, int y ) { switch(key) { case GLUT_KEY_LEFT: //do something break; case GLUT_KEY_RIGHT: //do something break; case GLUT_KEY_UP: //do something break; case GLUT_KEY_DOWN: //do something break; } } int main (int argc, char **argv) { //... glutKeyboardFunc(KeyboardFunc); glutSpecialFunc(SpecialFunc); //... glutMainLoop(); return 0; }
Quelle: https://www.opengl.org/resources/libraries/glut/spec3/node54.html