Spielstand speichern



  • 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ück

    GetParameter()
    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.

    Download:
    http://mitglied.lycos.de/gidxgraphic/multipars/



  • 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



  • Dieses XML-Style Format hat einige Nachteile und man sollte sich überlegen ob man sich das antun will:
    - Die Datei enthält unmengen unnötige Information
    - Die Datei ist lesbar (Jeder kann das Savegame ändern)
    - Das Zeug muss interpretiert werden

    Binär speichern und beim lesen gleich in die entsprechenden Datenhalter pumpen ist wohl der beste Weg - Auch wenn man beim ersten Anlauf mit den Offsets erfahrungsgemäß ins Klo greift 😃 (Siehe Kommentar von Tc++H über 3DS Chunks)



  • Cpp_Junky schrieb:

    Auch wenn man beim ersten Anlauf mit den Offsets erfahrungsgemäß ins Klo greift 😃 (Siehe Kommentar von Tc++H über 3DS Chunks)

    Bye, TGGC (Demo or Die)



  • Es ist zwar schon länger her aber ich hab jetzt vieles probiert aber
    denn array krieg ich nicht aus gelesen.er lies aus aber z.b.
    In Datei=123
    In Array:
    test[5]
    test[0]=123
    test[1]=123
    test[2]=123
    test[3]=123
    test[4]=123
    ..
    Versteht ihr mein problem ich komm nicht weiter. 😞



  • Wenn in der Datei nur dieses Array und sonst nichts gespeichert wird, ist es am einfachsten, den Wert jedes Feldes in eine Zeile zu schreiben.

    0
    0
    5
    0
    0
    1
    0
    1
    

    Beim Laden der Datei musst du nur pro Zeile einen Zähler aktualisieren
    und den Inhalt der Zeile ins entsprechende Feld pumpen.
    So ungefähr:

    (Pseudocode)

    int nZeile = 0;
    while (LeseDatei)
    {
        if (nZeile < ArrayGroesse)
        {
            Array[nZeile] = atoi(Zeileninhalt);
            nZeile++;
        }
        else
        {
            // Fehler in der Matrix =)
            break;
        }
    }
    


  • Danke. ich wusste gar nicht das man das zählen kann.



  • Wieso sollte man nicht?

    Bye, TGGC (Demo or Die)


Anmelden zum Antworten