Spielstand speichern



  • War mir nicht sicher ob das in das Spieleforum kommt oder hier rein. Ich entschied mich für dieses Forum, weil es doch sehr C++ spezifisch ist.

    Ich habe eine Klasse Player. Davon habe ich zwei Objekte (Player 1 und 2). Die Daten von beiden Spielern möchte ich sichern. Ich habe gelernt (zumindest so verstanden :D) das man globale Funktionen den Methoden einer Klasse vorziehen soll, wenn beide Objekte gleich berechtigt behandelt werden müssen. Daher denke ich, ich sollte eine global Funktion schreiben, die das Speichern regelt. Eine Methode wäre in diesem Fall wohl weniger sinnvoll...,oder?



  • Also Theorie hin oder her, ich würde eine Save() Member für die Player-Klasse implementieren. Das ist doch wunderbar. Wozu globale Funktionen? Die sind doch gerade "unschön" - jedenfalls in diesem Fall.



  • Ja, aber ich muss ja zwei Objekte speichern, nicht nur das Objekt selber. Dann würde die Methode ja so aussehen:

    bool save(const Player& p2);
    

    Und der Aufruf später:

    p1.save(p2);
    

    😞 ich weiß nicht, ich finde das "sieht" doch komisch aus...



  • Hem, weiß nicht wo es steht, das man Funktionen den Methoden vorziehen soll? Haste ne Quelle?

    Aber das hier mußt du auf jeden Fall machen:

    class Player
    {
    public:
         save(ofstream &savegame);
         load(ifstream &savegame);
    };
    

    In die save-Methode schreibst du dann die nötigen Object-Daten raus, wie z.B. den Namen des Players, sein Punktestand etc..

    Und dann könntest du natürlich folgendes machen, wenn du unbedingt eine Funktion haben willst:

    void saveGame()
    {
        ofstream out("savegame.txt", ios_base::out | ios_base::trunc);
        player1->save(out);
        player2->save(out);
    }
    

    Naja, so als Anhaltspunkt für dich.



  • Danke für den Tipp!
    Ich glaube das, das bei mir anders gemeint war. Z.B. eine Funktion die beide Objekte austauscht. Wo die Objekte irgendwie gleichberechtigt behandelt werden...

    Zu deinem Tipp:
    Normalerweise baue ich die save Methode auch in die Klasse ein, aber hier habe ich eben meine Probleme da ich zwei Objekte (in eine Datei) speichern möchte.

    void saveGame()
    {
        ofstream out("savegame.txt", ios_base::out | ios_base::trunc);
        player1->save(out);
        player2->save(out);
    }
    

    Sicher das, das stimmt?
    trunc => eine bereits bestehende Datei wird beim Öffnen gelöscht.
    Daher würde doch player2 die gespeicherten Daten von player1 überschreiben, oder?



  • Nein, Player 2 öffnet die Datei ja nicht erneut, er schreibt nur seinen Kram dazu.



  • achso, wenn dem so ist, dann könnte das ganze ja funktionieren, thx 🙂



  • Genau, denn der Hintergedanke dabei ist, das Player sich nicht mehr um das öffnen u.ä. des Files kümmern soll. Es bekommt einfach nur gesagt: "Hey, hier ist ein Outstream, schreib deinen Kram da rein! Der Rest soll dir egal sein!" Somit kann man allen Objekten sagen, das sie es tun sollen. Letztendlich weiß keiner wo sein Kram landet, was auch gut ist.


Anmelden zum Antworten