Spielstand speichern
-
Du musst dir überlegen, welche Objekte den aktuellen Spielzustand beschreiben. Bei mir gibt es oft eine Klasse "Game", die nicht, wie man meinen könnte, irgendwie was globales darstellt, sondern Instanzen davon sind einzelne Spiele (die Dinger, die man startet und dann gewinnt oder verliert). In jedem Spiel gibt es bei einem RTS eine Karte, eine Liste aller Objekte, Spieler-Informationen (Kontostand). Bei einem Ego-Shooter wäre es nicht so viel anders: Eine Karte, Informationen über den Spielerzustand, alle Projektile die gerade durch die Luft sausen, alle Objekte auf der Karte, alle Deformierungen, abgeschlossene Teilmissionen...
Alles, was irgendwie den aktuellen Zustand von einem Spiel beschreibt, kann man hier reinpacken... muss man aber nicht. Man muss nur wissen, was man alles braucht und dann ist sowas vielleicht praktisch.Jetzt musst du dir für alle diese Entitäten eine Methode ausdenken, sie zu speichern und zu laden. Du könntest, wenn es Klassen sind, jede Klasse eine save(ostream&) Methode implementieren lassen. Naja, darüber habe ich mir nicht viel Gedanken gemacht, in C# jag ich alles nur durch einen Serializer. Im Grunde musst du halt Serialisierung selber implementieren, überlegen, wie du etwas so als Bytefolge darstellst, dass du es wieder sinnvoll laden kannst.
-
Also könnte ich ein array machen denn wert wo der spieler ist kann
gespeichert werden und wird geladen wenn man es will.Ginge es so?mfg.
Stefan
-
Warum soll es so nicht gehen?
-
ich hab noch nie sowas programmiert.
mfg.
Stefan
-
Stefan311 schrieb:
ich hab noch nie sowas programmiert.
Ich auch nicht.
Bye, TGGC
-
Aber ich geh mal davon aus das ihr mehr Erfahrungen habt ich
programmiere seit letztes jahr herbst ungefähr als Hobby Aber ich
hoffe natürlich das als ausbildung machen zu können.mfg.
Stefan
-
Bei einem einfachen Textadventure nutzt du am einfachsten ein Array für die Zustände.
Beispiel:
Pseudo:
if (Array[0] == 0) // Geld noch nicht genommen Text("Da liegt Geld rum"); if (SpielerNimmtGeld() && Array[0] == 0) { InsInventar("Geld"); Array[0] = 1; }
Wenn im Feld 0 eine 1 steht bedeutet das also das der Spieler das Geld eingesammelt hat. Speichern kannst du das dann am einfachsten als Text
a la0 = 1 1 = 0 2 = 0 3 = 0 4 = 1 5 = 0 usw...
...und überträgst die Werte beim laden wieder ins Array. Dann hast du genau den Zustand wieder den du erzeugt hast.
-
Danke.Daran hatte ich noch garnicht gedacht das mit zuspeichern.
Kann man Eigentlich daten sofort in einem integer einlesen?mfg.
Stefan
-
Jeap kannst sofort in nen Integer laden:
int integer; ifstream file("myfile.txt"); file >> integer; file.close();
Array aus datei laden kannst du vielleicht so machen:
int integers[100]; ifstream file("myfile.txt"); for(int i=0; i<100; i++) { file >> integers[i]; } file.close();
-
Danke und ich dachte immer man kann nur Strings aus der Datei lesen.
Ich hab jetzt etwas ungefähres:
Wenn man ein gespeichertes Spiel laden will gibt man den namen von dem Profil
an.Das Programm äffnet es liest die zahlen aus und fertig.Wenn man neu das spiel anfängt gibt man ein Profilnamen ein das Programm erstellt drei Dateien:
Wo man ist,
Was man hat,
Stärke,Zauber,leben,etc...Nochmals Danke jetzt weiß ich ungefähr wie ich das machen kann.
mfg.
Stefan
-
Stefan311 schrieb:
Nochmals Danke
np
Bye, TGGC
-
Man könnte ja Z.B.: das SaveGame ähnlich wie HTML aufbauen und mit getline Zeile für Zeile abfragen.
<PLAYER POSITION>10, 20, 44</PLAYER POSITION>
<PLAYER HEALTH>100</PLAYER HEALTH>
...
-
Der Quellcode dürfte sich von alleine erklären
:
struct VECTOR
{
float x, y, z;
};struct PLAYER
{
int Health;
int Level;
VECTOR Position;
};void Write()
{
FILE *pFile = fopen("1.txt", "w+");
PLAYER player;player.Health = 100;
player.Level = 15;
player.Position.x = 0.0324f;
player.Position.y = 1.04f;
player.Position.z = 4.89f;fprintf(pFile, "<HEALTH>%d</HEALTH>", player.Health);
fprintf(pFile, "<LEVEL>%d</LEVEL>", player.Level);
fprintf(pFile, "<POSITION>%f %f %f</POSITION>", player.Position.x,
player.Position.y,player.Position.z);
fclose(pFile);
}void Read()
{
FILE *pFile = fopen("1.txt", "r+");
PLAYER player;fscanf(pFile, "<HEALTH>%d</HEALTH>", &player.Health);
fscanf(pFile, "<LEVEL>%d</LEVEL>", &player.Level);
fscanf(pFile, "<POSITION>%f %f %f</POSITION>", &player.Position.x, &player.Position.y, &player.Position.z);
printf("Player Health: %d\n", player.Health);
printf("Player Level: %d\n", player.Level);
printf("Player Position: %f %f %f\n", player.Position.x, player.Position.y, player.Position.z);fclose(pFile);
}..::TcH && NwP::..
-
Danke.Ich werde es mir abspeichern und mir das auch genauer ansehen.
Im moment denke ich mir noch das ganze systemm aus.Karte und so.
Aber trodzdem danke.mfg.
Stefan
-
Tc++H schrieb:
Der Quellcode dürfte sich von alleine erklären
:
...
Der Code ist irgendwie nicht sehr sinnvoll. Wenn man schon so ein XML-mäßiges Verfahren benutzt, dann soll man es auch wie XML parsen und nicht die Reihenfolge festlegen, in der die Elemente auftauchen müssen, so wie Du das da tust.
Dann kannst Du es auch gleich sein lassen und einfach nur die Werte speichern.
-
Ich hatte mal vor einer Weile einen Parser programmiert.
Eigentlich hatte ich versucht eine eigene String-Klasse zu pogrammieren und der Parser war ein Abfallprodukt.
In dem Beispiel auf der Downloadseite zerlege ich den String Add(5,20) um die beiden Werte zu addieren.
GetFunctionName()
Gibt den Funktionsnamen aus dem String zurückGetParameter()
Gibt beliebigen Parameter aus dem String zurück.Der Quellcode ist mit dabei. Also könntest du es einfach so umschreiben das es mit der STL funktioniert und musst nicht meine Stringklasse verwenden.
-
Klar, dass der Source wenig Sinn macht, aber es geht ums Prinzip. Man sollte vieleicht sein Spielstand flexibel machen. Möglicherweise ne Art Chunk's benutzen siehe 3Ds-Format.
-
Mhh, das XGamesSDK muss unbedingt wieder online.
Bye, TGGC (Demo or Die)
-
Hab noch ne Frage: Wie funzt Parsen??. Hab mich nicht so extrem mit Savegames beschäftigt, wollte nur mal nen Vorschlag äußern.
-
Tc++H schrieb:
Hab noch ne Frage: Wie funzt Parsen??. Hab mich nicht so extrem mit Savegames beschäftigt, wollte nur mal nen Vorschlag äußern.
Kommt drauf an. Wenn du XML benutzt, dann gibt es dafür vorgefertigte Libraries (zB Xerces oder tinyXML).
Wenn du dein eigenes Format definieren willst --> denk nach, oder les ein Buch