Ascii Game Projektile



  • Hallo!

    Ich habe in meinem Spiel eine Figur, dass hin und her laufen kann...(Ascii)

    Ich will jetzt, dass er auch Projektile schießen kann.
    Kann mir jemand helfen wie man das macht? 😕

    Ich benutze Dev-C++



  • Zeig mal Code.



  • #include <iostream> 
    #include <windows.h> 
    #include <conio.h> 
    
    using namespace std; 
    
    void SetPos(int x, int y) 
    { 
        COORD cPos; 
        cPos.X = x;
        cPos.Y = y;
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cPos); 
    }
    void CPos(int x, int y)
    {
         COORD cPos;
         cPos.X = x;
         cPos.Y = y;
         SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cPos);
    }
    void StdColor()
    {
         SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
    }
     char map[20][64] = {"                                                               ",
                         "                                                               ",
                         "                                                               ",
                         "                                                               ",
                         "                                                               ",
                         "                                                               ",
                         "                                                               ",
                         "                                                               ",
                         "                                                               ",
                         "                                                               ",
                         "                                                               ",
                         "                                                               ",
                         "                                                               ",
                         "                                                               ",
                         "                                                               ",
                         "                                                               ",
                         "                                                               ",
                         "                                                               ",
                         "MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM"};
    
    void DrawArray()
    {
         CPos(20,0);
         for(int y =0; y < 20; y++)
         {
                 for(int x = 0; x < 64; x++)
                 {
                         cout << map[y][x];
                 }
                 cout << endl;
         }
    }
    
    void DrawMap();
    void Map();
    void Keys();
    void Inst();
    void Check();
    
    void DrawMap()
    {
         for(int y = 0; y < 20; y++)
         {
                 for(int x = 0; x < 64; x++)
                 {
                         switch(map[y][x])
                         {
                                          case 'M':
                                               CPos(y,x);
                                               cout << (char)219;
                                               break;
                         }
                 }
                 cout << endl;
         }
    }
    
    enum Keys {
        left=75,
        right=77,
        up=72,
        down=80
    };
    int Key;
    int x,y;
    char player = (char)1;
    char back = ' ';
    char s_save = ' ';
    bool switcher = false;
    bool draw = false;
    int s_side;
    
    int main() {
    	SetConsoleTitle("Minecraft 2D");
        unsigned int xPos=40;
        unsigned int yPos=12;
        const char player=1;
    
        do {
            CPos(xPos,yPos);
            cout << player;
            if(kbhit()) {
                CPos(xPos,yPos);
                cout << " ";
                unsigned char key=getch();
                switch(key) {
                case 97:
                    --xPos;
                    break;
                case 100:
                    ++xPos;
                    break;
                case 119:
                    --yPos;
                    break;
                case 115:
                    ++yPos;
                    break;
                }
            }
        } while(1);
    }
    

    Kannst du mir bitte helfen?



  • Du wirst irgendwie eine Liste von Projektilen verwalten müssen.
    Da du C++ verwendest würde ich einen std::vector<Bullet> vorschlagen.
    Bullet kann dabei z.B. so aussehen:

    struct Bullet
    {
        int posX;
        int posY;
        int speedX;
        int speedY;
        int timeToLive;
    };
    

    Dann baust du einen neuen case in dein switch ein für wenn die "schiessen" Taste gedrückt wurde.
    Dort erzeugst du eine neue Bullet, schön initialisiert mit der Position des Spielers (posX/Y), der Richtung in die die Bullet fliegen soll (speedX/Y) und der Reichweite (timeToLive). Und hängst die neue Bullet in deine Bullet-Liste ein.

    Dann wirst du regelmässige Updates brauchen, idealerweise mit einer fixen Frequenz. Für den Anfang tut's da aml ein Sleep() in deiner Hauptschleife, gefolgt von einen Update() (neue Funktion) Aufruf.

    Und in Update() schiebst du alle Bullets weiter (posX/Y += speedX/Y), verringerst ihre Lebenszeit (timeToLive -= 1) und löscht sie wenn sie "gestorben" sind.

    Dann musst du die Bullets "nur" noch zeichnen.

    Die wohl einfachste Variante dazu wäre immer das ganze Bild neu zusammenzubauen und komplett auszugeben. Also ein zweites Array wie dein "map" Array, wo du als erstes mal die "map" reinkopierst. Dann schreibst du der Reihe nach alle Bullets rein und am Schluss den Spieler. Und dann malst du das so zusammengebaute Array in die Konsole. Idealerweise mit einem einzigen WriteConsole Aufruf.

    Dadurch sparst du dir das Löschen an der alten Position. Je mehr Features du einbaust, desto lästiger wird das nämlich werden, daher würde ich mich gleich davon verabschieden.



  • Hi, danke für die schnelle Antwort!!

    Da ich noch ein totaler Anfänger bin hab ich leider keine Ahnung 😞

    Ich hab hier noch mal den Code ohne der Map (die Map funktioniert irgendwie nicht.. vielleicht kannst du mir ja auch hier helfen 😉 )

    Außerdem möchte ich einen Boden damit er nicht hin und her schweben kann..(für das muss ich natürlich zwei Tasten weglassen, die nach oben und unten.. aber wie zeichne ich einen Boden und lasse die Figur ganz unten starten? Damit sie nicht in der Luft nach rechts und links laufen kann 😉 )

    Danach kommen natürlich andere Sachen wie (Springen, sprinten (also schneller laufen).....) ABER zuerst möchte ich, dass die Figur normal auf dem Boden steht und Projektile nach rechts und links schießen kann.

    Ich wäre sehr dankbar, wenn du mir dabei hilfst!! 🙂 👍

    #include <iostream> 
    #include <windows.h> 
    #include <conio.h> 
    
    using namespace std; 
    
    void SetPos(int x, int y) 
    { 
        COORD cPos; 
        cPos.X = x; 
        cPos.Y = y; 
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cPos); 
    } 
    
    enum Keys { 
        left=75, 
        right=77, 
        up=72, 
        down=80 
    }; 
    
    int main() { 
        SetConsoleTitle("Minecraft 2D");
        unsigned int xPos=40; 
        unsigned int yPos=12; 
        const char player=1; 
    
        do { 
            SetPos(xPos,yPos); 
            cout << player; 
            if(kbhit()) { 
                SetPos(xPos,yPos); 
                cout << " "; 
                unsigned char key=getch(); 
                switch(key) { 
                case 97: 
                    --xPos; 
                    break; 
                case 100: 
                    ++xPos; 
                    break; 
                case 119: 
                    --yPos; 
                    break; 
                case 115: 
                    ++yPos; 
                    break; 
                } 
            } 
        } while(1); 
    }
    


  • Die wohl üblichste Art wie man es in Spielen dieser Art macht, ist ein 2-dimensionales Array wo das Level abgespeichert ist.
    Da "malst" du deinen Boden rein, im Prinzip genau so wie du es in deinem ersten Versuch hattest.

    Und dann brauchst du auf jeden Fall einen Game-Loop. Die einfachste Variante ist diesen mit fixer Frequenz laufen zu lassen.

    Beispielsweise so

    char map[...][...] = ...
    
    int main() { 
    
        // ...
    
        while (true)
        {
            Sleep(100);
            Update();
            Render();
        }
    }
    
    void Update()
    {
        // Input lesen, Figur bewegen etc.
    }
    
    void Render()
    {
        // Aktuelles Frame am Bildschirm ausgeben
    }
    

    Wenn du dann willst dass die Figur des Spielers immer auf den Boden fällt, dann kannst du in Update() z.B. einfach prüfen ob das Feld unterhalb des Spielers leer ist, und wenn ja, dann setzt du ihn eins weiter runter:

    void Update()
    {
        if ((playerY + 1) < LevelHeight && map[playerY][playerX] == ' ')
            playerY += 1;
    }
    

    Ich vermute aber dass dir noch einige Grundlagen fehlen, ich würde also vorschlagen dass du erstmal an der Front weiter machst.



  • Danke für die Antwort!!

    Leider gab es ein paar Fehler beim Konvertieren...(Ich benutzte Dev-C++)
    Fehler:

    In function 'int main()':
    [Error] 'Update' was not declared in this scope
    [Error] 'Render' was not declared in this scope

    In function 'void Update()':
    [Error] 'playerY' was not declared in this scope
    [Error] 'LevelHeight' was not declared in this scope
    [Error] 'playerX' was not declared in this scope

    Bei mir sieht der Code jetzt so aus:

    #include <iostream> 
    #include <windows.h> 
    #include <conio.h> 
    
    using namespace std; 
    
    void SetPos(int x, int y) 
    { 
        COORD cPos; 
        cPos.X = x; 
        cPos.Y = y; 
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cPos); 
    } 
    
    char map[20][64] =  {"                                                               ", 
                         "                                                               ", 
                         "                                                               ", 
                         "                                                               ", 
                         "                                                               ", 
                         "                                                               ", 
                         "                                                               ", 
                         "                                                               ", 
                         "                                                               ", 
                         "                                                               ", 
                         "                                                               ", 
                         "                                                               ", 
                         "                                                               ", 
                         "                                                               ", 
                         "                                                               ", 
                         "                                                               ", 
                         "                                                               ", 
                         "                                                               ", 
                         "MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM"};
    
    int main() { 
      SetConsoleTitle("Minecraft 2D");
        unsigned int xPos=40; 
        unsigned int yPos=12; 
        const char player=1; 
    
        do { 
            SetPos(xPos,yPos); 
            cout << player; 
            if(kbhit()) { 
                SetPos(xPos,yPos); 
                cout << " "; 
                unsigned char key=getch(); 
                switch(key) { 
                case 97: 
                    --xPos; 
                    break; 
                case 100: 
                    ++xPos; 
                    break; 
                case 119: 
                    --yPos; 
                    break; 
                case 115: 
                    ++yPos; 
                    break; 
                } 
            } 
        } while(1); 
    
        while (true) 
        { 
            Sleep(100); 
            Update(); 
            Render(); 
        } 
    } 
    
    void Update() 
    { 
        if ((playerY + 1) < LevelHeight && map[playerY][playerX] == ' ') 
            playerY += 1;  // Input lesen, Figur bewegen etc. 
    } 
    
    void Render() 
    { 
        // Aktuelles Frame am Bildschirm ausgeben 
    }
    
    enum Keys { 
        left=75, 
        right=77, 
        up=72, 
        down=80 
    };
    

    Kannst du mir bitte helfen? 😕



  • Pack mal Update() und Render() über deine main() oder mach eine Vorwärtsdeklaration.



  • Danke es hat geklappt!!

    Jetzt muss ich nur noch die hier korrigieren.

    In function 'void Update()':
    [Error] 'playerY' was not declared in this scope
    [Error] 'LevelHeight' was not declared in this scope
    [Error] 'playerX' was not declared in this scope

    Kann mir da jemand helfen?



  • Innerhalb der Funktion update sind die in der main deklarierten Variablen nicht bekannt.



  • *facepalm*


Log in to reply