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 dezimalzahlenangaben

    da 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


Anmelden zum Antworten