kleines Spiel zur Übung (mit Konsole realisiert)
-
Hallo,
ich versuche mich gerade an einem kleinen Spiel und hab folgende Fragen dazu:
Wie realisiere ich denn am besten ein kleines steuerbares Zeichen?
Wie kann ich hier eine Kollisionsabfrage realisieren?Hier der (bisher kleine) Code
#include <iostream> #include <ctime> using namespace std; int main() { cout<<"Kleines Spiel, drücke eine Taste um es zu starten!"<<endl; cin.get(); for(int i=1;i<=2000;i++) { cout<<"* *"<<endl; _sleep(80); cout<<" * *"<<endl; _sleep(80); cout<<" * *"<<endl; _sleep(80); cout<<" * *"<<endl; _sleep(80); cout<<" * *"<<endl; _sleep(80); cout<<" * *"<<endl; _sleep(80); cout<<" * *"<<endl; _sleep(80); cout<<" * *"<<endl; _sleep(80); cout<<" * *"<<endl; _sleep(80); cout<<"* *"<<endl; } cin.get(); }
Ist wirklich nur der Anfang, die "Strasse" und der ganze Aufbau wird natürlich noch geändert. Mir geht es bisher lediglich um die Realisierung.
Auf dem Bildschirm sieht es so aus (das dickgedruckte X weiss ich eben noch nicht, wie ich das hinbekomme)...
------------------------------------- | | |* * | | * * | | * * | | * * | | * * | | * * | |* * | | * * | | * * | | * [b]X[/b] * | -------------------------------------
Danke für eure Hilfe
-
also das was du willst ginge mit nem Konsolenframebuffer.. ist aber lahmar***
-
Ich sage mal das der Ansatz ganz falsch ist.
Mach ein Array. Dieses soll deinen Bildschirm darstellen. Dieses Array kann Werte speichern. Je nach dem Wert im Array kann es die Straße sein oder der Spieler.
Du bewegst die Werte im Array. Und am Ende zeichnest du den Inhalt vom Array auf dem Monitor.
-
Netzwerk-Latenz schrieb:
Ich sage mal das der Ansatz ganz falsch ist.
Mach ein Array. Dieses soll deinen Bildschirm darstellen. Dieses Array kann Werte speichern. Je nach dem Wert im Array kann es die Straße sein oder der Spieler.
Du bewegst die Werte im Array. Und am Ende zeichnest du den Inhalt vom Array auf dem Monitor.
ok...
Meinst du so ein mehrdimensionales Array?
Wie bewege ich denn am besten das Array?
-
Mehrdimensional wäre schon nicht schlecht bei einem mehrdimensionalen Bildschirm
Du kannst im Prinzip eine Queue (Schlange) für Deine Strassendarstellung benutzen.
Du füllst am Anfang das Array mit dem ersten "Bild" der Strasse. Die Bewegung erreichst Du, indem Du alle Zeilen des Arrays eine Zeile nach unten verschiebst und eine neue oben einfügst.Nochmal zum Thema Mehrdimensionalität: Vielleicht ist es auch clever statt einem Array[x][y] ein Array[x*y], also doch eindimensional, zu benutzen. Das macht imho die dynamische Speicherverwaltung einfacher. Dann greifst Du ein Element des Arrays statt mit Array[x][y] mit Array[y*xmax+x] heraus.
-
So ist das total scheisse. Machs doch wie das beim Contest.
Bye, TGGC (Ein Jahr Helden)
-
#include <iostream> #include <string> int iSpielfeld[10][10]; int main() { int i,j; // Spielfeld mit Nullen füllen for(i=0; i<10; i++) for(j=0; j<10; j++) iSpielfeld[i][j]=0; // Spieler positionieren int x=4; int y=4; iSpielfeld[x][y]=1; // Spielfeld zeichnen for(i=0; i<10; i++) { for(j=0; j<10; j++) { if(iSpielfeld[i][j]==1) // Der Spieler std::cout<<"*"; else // Ein freies Feld std::cout<<" "; } std::cout<<"\n"; } return 0; }
Ich habe dir mal ein Beispiel vorbereitet.
An Position x 4, y 4 wird der Spieler gezeichnet. Es ist auch möglich für Wände ect. einen anderen Wert zu nehmen z.B. eine 2 für Wände. So könntest du auch die Kollisionsabfrage lösen. Du könntest abfragen:
if(iSpielfeld[PlayerX][PlayerY]==2) //Da ist eine Wand
-
Netzwerk-Latenz schrieb:
Ich sage mal das der Ansatz ganz falsch ist.
Mach ein Array. Dieses soll deinen Bildschirm darstellen. Dieses Array kann Werte speichern. Je nach dem Wert im Array kann es die Straße sein oder der Spieler.
Du bewegst die Werte im Array. Und am Ende zeichnest du den Inhalt vom Array auf dem Monitor.
Sag ich ja
framebuffer..
Das flackert aber dann mächtig..Ich würds mal mit Assembler probieren.. oder die WinAPI-Konsolenbefehle..
-
Arbeite doch mit sowas:
#include <windows.h> ... void gotoxy(int x, int y) { COORD coordScreen; coordScreen.X = x; coordScreen.Y = y; SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), coordScreen); }
Dann musst du immer nur das entsprechende Zeichen neu schreiben und nich das ganze bild.
-
mal davon abgesehen das es extrem flackern wird
...
wenn du ein char array hättest bräuchtest du das if in der schleife nicht mehr sondern könntest einfach das ganze array ausgeben lassen.. dann würde eventuell dadurch das das schneller gezeichnet werden könnte minimal ein bisschen weniger flackern auftreten
wie willst du das eigentlich mit der steuerung machen? immer abwechselnd bild anzeigen steuerungs input oder mit threads?
-
Ich erinnere mich gerade an "good-old-Basic-Zeiten". Da hatte ich dieses Flackern auch, konnte es aber beheben, indem ich, statt alles neu zu zeichnen einen PRINT Befehl ohne Inhalt (also \n) ausgeführt habe. Dadurch ist alles eine Zeile hochgerutscht, und das ohne zu flackern.
Aber gemäss dem Fall, das das funktioniert, fährt man dann natürlich nach unten....
-
ja aber das auto würde doch mit rutschen bzw. würde dann doch ganz oft angezeigt O_o also wenn ich das richtig verstehe das du nicht immer den ganzen screen neu zeichnen möchtest...
-
Jup, absolut richtig. Hatte ich nicht dran gedacht. Man könnte jedoch das Auto vorm \n löschen und danach wieder zeichnen (oder einfach wegkommen von der Konsolenanwendung
)