Spielesteuerung in der konsole?
-
hi,
kann mir jemand sagen wie ich(wenn möglich mit code-beispiel) eine simple steuerung für die doskonsole machen kann? das ich z.b. (ganz einfach) einen buchstaben per pfeiltasten über die konsole wandern lassen kann...
danke im voraus
grüße
cross
(oder schickt mir ne mail: slin@slin-online.de)
-
ok windows-konsole
als erstes brauchst du die ascii-codes für die 4 cursorrichtungen
hoch: 72
runter: 80
links: 75
richts: 77
alles dezimalzahlenangabenda die cursortasten sondertasten sind wird beim drücken der taste erst das codezeichen 0 geschickt. d.h du musst überprüfen ob eine sondertaste gedrückt wurde und danach die cursortaste ermitteln. zum einlesen der ascii-codes kannst du beim borland compiler !compilerspezifisch! die getch()-funktion verwenden. willst du standard !windows! musst du die funktion ReadConsoleInput() verwenden.
nach dem auslesen der cursorrichtung positionierst du den cursor in der console neu.
angenommen zeichen 'a' ist auf der position 1/1, cursortaste rechts wird gedrückt -> 'a' muss auf 2/1 gerückt werden. Cursorpositionierung findest du in der faq unter "improved console". da ist eine nette funktion dabei.
bevor du nun das zeichen auf die neue position verschiebst musst du das alte löschen: 'a' nochmal neu schreiben, diesmal in der farbe deines hintergrundes.so a bisserl schwer geschrieben aber so wäre die funktionsweise. und vielleicht kann ichs heut noch schreiben ;););)
-
na hoffentlich war das keine hausaufgabe ;););)
/* by siranus 18/09/2002 Hab ja sonst nix besseres zu tun ;) */ #include <windows.h> #include <stdio.h> #define CODE_DOWN 0x50 #define CODE_UP 0x48 #define CODE_RIGHT 0x4D #define CODE_LEFT 0x4B #define CODE_ESC 0x1B #define CODE_F9 0x43 #define CODE_F10 0x44 #define CODE_F11 0x85 #define CODE_F12 0x86 #define CODE_ENTER 0x0D int main ( int argc, char** argv ) { /*Enthält den Code für das Eingegebene Zeichen*/ INPUT_RECORD Input; /*Anzahl eingelesener Aktionen (Maus,Tastatur)*/ DWORD Events; /*Position des Zeichens*/ COORD Coord; Coord.X = 0; Coord.Y = 0; /*Handle für Ausgabe ermitteln*/ HWND hOutputHandle = GetStdHandle(STD_OUTPUT_HANDLE); if ( hOutputHandle == INVALID_HANDLE_VALUE ) return 1; /*Handle für Eingabe ermitteln*/ HWND hInputHandle = GetStdHandle(STD_INPUT_HANDLE); if ( hInputHandle == INVALID_HANDLE_VALUE ) return 1; /*Zeichen in der Konsole positionieren*/ SetConsoleCursorPosition(hOutputHandle,Coord); printf("%c",'A'); do { /*1. Mal eingegebene Zeichen lesen*/ if ( !ReadConsoleInput(hInputHandle,&Input,1,&Events) ) return 1; /*Wenn das Zeichen 0 ist, ist es ein Sonderzeichen, dazu gehören auch die Cursortasten*/ if ( Input.Event.KeyEvent.uChar.AsciiChar == 0x00 ) { /*2. Mal einlesen, es folgt der Tastaturcode für die Taste, die gedrückt wurde*/ if ( !ReadConsoleInput(hInputHandle,&Input,1,&Events) ) return 1; switch ( Input.Event.KeyEvent.wVirtualScanCode ) { case CODE_DOWN: /*Text-Farbe mit dem Hintergrund abgleichen ( normal ist schwarz )*/ SetConsoleTextAttribute(hOutputHandle,0); /*Zurück zum Zeichen*/ SetConsoleCursorPosition(hOutputHandle,Coord); /*neu schreiben, diesmal in schwarz, man sieht nix*/ printf("%c",'A'); Coord.Y++; SetConsoleTextAttribute(hOutputHandle,0x0008 | 0x0007); SetConsoleCursorPosition(hOutputHandle,Coord); printf("%c",'A'); break; case CODE_UP: SetConsoleTextAttribute(hOutputHandle,0); SetConsoleCursorPosition(hOutputHandle,Coord); printf("%c",'A'); Coord.Y--; SetConsoleTextAttribute(hOutputHandle,0x0008 | 0x0007); SetConsoleCursorPosition(hOutputHandle,Coord); printf("%c",'A'); break; case CODE_LEFT: SetConsoleTextAttribute(hOutputHandle,0); SetConsoleCursorPosition(hOutputHandle,Coord); printf("%c",'A'); Coord.X--; SetConsoleTextAttribute(hOutputHandle,0x0008 | 0x0007); SetConsoleCursorPosition(hOutputHandle,Coord); printf("%c",'A'); break; case CODE_RIGHT: SetConsoleTextAttribute(hOutputHandle,0); SetConsoleCursorPosition(hOutputHandle,Coord); printf("%c",'A'); Coord.X++; SetConsoleTextAttribute(hOutputHandle,0x0008 | 0x0007); SetConsoleCursorPosition(hOutputHandle,Coord); printf("%c",'A'); break; /*sonstige Tasten*/ default: break; } } }while ( 1 ); }
code erfolgreich getestet mit win2000 und borland builder. falls du noch fragen hast, einfach rühren bzw. msdn.
-
Das ist ja echter Service ;). Trotzdem: Ein Blick in die FAQ des fragenden hätte auch gereicht!
MfG SideWinder
-
Original erstellt von SideWinder:
Ein Blick in die FAQ des fragenden hätte auch gereicht!Gramatikalisch richtiger wäre doch "Ein Blick des fragenden in die FAQ hätte auch gereicht!".
Aber ich hab auch noch eine Frage zum Quelltext, ich arbeite seit kurzem mit Dev-C++ und habe in der Zeile
HWND hOutputHandle = GetStdHandle(STD_OUTPUT_HANDLE);
den Fehler "ANSI C++ forbids implicit conversion from `void *' in initialization" und in der Zeile
HWND hInputHandle = GetStdHandle(STD_INPUT_HANDLE);
den selben Fehler. Woran liegt das?
-
Gramatikalisch richtiger wäre doch "Ein Blick des fragenden in die FAQ hätte auch gereicht!".
Uh, der Fehler von mir tut weh - danke für die richtigstellung!
Versuch mal sowas stattdessen:
HWND h = 0; h = GetStdHandle ( STD_OUTPUT_HANDLE ); // Oder eben INPUT
Dann casten wir kein void implizit in einer Initialisation. Ansonsten caste mal explizit!
MfG SideWinder
-
sehr gut, ihr habt mir sehr geholfen!..vielen dank
-
Original erstellt von SideWinder:
**Das ist ja echter Service ;). Trotzdem: Ein Blick in die FAQ des fragenden hätte auch gereicht!MfG SideWinder**
Also über das Thema ist die FAQ schwach, da steht halt nur mit getch...... und ne liste, aber kein Beispiel....
-
Hmm, findest du? Ich meine man findet alle Funktionen die in Frage kämen und kann lesen (vielleicht wäre sehen tatsächlich besser), dass man bei Sondertasten auch noch mal gesondert einlesen muss...
Findest du ehrlich, das sich da was tun müsste?
MfG SideWinder