Fremdcode erklären
-
Hallo ich habe hier etwas Fremdcode und hätte den mal gerne erklärt bekommen,
Stammen tut der Code von hier http://www.undertec.de/blog/2009/05/kbhit_und_getch_fur_linux.htmlich habe damit eine prinzipielle Spielesteuerung gebaut, wüsste aber gerne was jede einzelne Zeile tut.
Ersetzt werden damit bei mir die Funktionen kbhit() und getch() der conio.h.
Die conio.h gibt es unter linux, dass ich verwende, nicht. Daher der Aufwand.die Funktion memcpy benötigt noch die <string.h> sonst meckert der Compiler
#include <termios.h> #include <string.h> int kbhit(void); int kbhit(void) { struct termios term, oterm; int fd = 0; int c = 0; tcgetattr(fd, &oterm); memcpy(&term, &oterm, sizeof(term)); term.c_lflag = term.c_lflag & (!ICANON); term.c_cc[VMIN] = 0; term.c_cc[VTIME] = 1; tcsetattr(fd, TCSANOW, &term); c = getchar(); tcsetattr(fd, TCSANOW, &oterm); if (c != -1) ungetc(c, stdin); return ((c != -1) ? 1 : 0); }
#include <termios.h> int getch(); int getch() { static int ch = -1, fd = 0; struct termios neu, alt; fd = fileno(stdin); tcgetattr(fd, &alt); neu = alt; neu.c_lflag &= ~(ICANON|ECHO); tcsetattr(fd, TCSANOW, &neu); ch = getchar(); tcsetattr(fd, TCSANOW, &alt); return ch; }
Hier mal noch Mein Code für die Spiele steuerung
Mit den Tasten wasd kann man die Ausgabe beinflussen. mit q beendet man das Programm.#include <stdio.h> #include <termios.h> #include <time.h> #include <string.h> //---Structuren--- //---Funktionsprototypen-- int kbhit(void); int getch(); char read_sign(char sign){ int lastchar = 0; int stop = 0; while(stop == 0){ sign=getchar(); if (sign!=EOF){ stop=1; } } } //kbhit(): int kbhit(void) { struct termios term, oterm; int fd = 0; int c = 0; tcgetattr(fd, &oterm); memcpy(&term, &oterm, sizeof(term)); term.c_lflag = term.c_lflag & (!ICANON); term.c_cc[VMIN] = 0; term.c_cc[VTIME] = 1; tcsetattr(fd, TCSANOW, &term); c = getchar(); tcsetattr(fd, TCSANOW, &oterm); if (c != -1) ungetc(c, stdin); return ((c != -1) ? 1 : 0); } int getch(){ static int ch = -1, fd = 0; struct termios neu, alt; fd = fileno(stdin); tcgetattr(fd, &alt); neu = alt; neu.c_lflag &= ~(ICANON|ECHO); tcsetattr(fd, TCSANOW, &neu); ch = getchar(); tcsetattr(fd, TCSANOW, &alt); return ch; } main(){ char c; while(c!='q'){ if(kbhit()){ // Nur wenn auch eine Taste gedrückt ist c = getch(); // Muss auf keine Eingabe warten, Taste ist bereits gedrückt switch(c){ case 'w': printf("case1"); break; case 'a': printf("case2"); break; case 's': printf("case3"); break; case 'd': printf("case4"); break; default: printf("default"); break; } } printf("%c\n",c); // Bewege andere Spielfiguren (z.B. die Snake-Schlange) // Geschwindigkeitsregler usleep(1000); } }
-
Hättest du dir mal die FAQ hier im Linux-Unterforum angesehen (da gehört die Frage auch hin) hättest du den selben Code gefunden.
Die Funktionen spielen halt mit termios rum.
memcpy ist in string.h deklariert, darum musst du das einbinden wenn du es nutz.
Allerdings ist das gar nicht nötig, da man struct auch direkt zuweisen kann.
Das ging in der Anfangszeit (vor ANSI) von C noch nicht.
Du darfst stattdessenterm = oterm;
schreiben.
Wird bei getch ja auch so gemacht:neu = alt;
Die Funktionen holen sich die Attribute von stdin (STanDardINput) und ändern sie. (kein Echo, keine Pufferung)
Dann werden die Daten geholt und die Original-Attribute wieder zurück geschrieben.