Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

21

06.07.2012, 20:54

Ich habe sowas für C# gemacht, da ist es dank Reflection wesentlich einfacher als für C++.
Aber im Prinzip läuft es darauf hinaus, dass du jedes Objekt nur ein einziges Mal speicherst und ihm dabei eine ID verpasst. Wenn nun eine Referenz auf das Objekt geschrieben wird, dann schreibt man nur diese ID.
Guck mal hier, Boost bringt sowas mit:
http://www.boost.org/doc/libs/1_50_0/lib…/doc/index.html

Später beim Laden muss man aufpassen, dass man die Objekte in der richtigen Reihenfolge lädt, und zwar so, dass ein referenziertes Objekt immer bereits vorher schon geladen wurde. Das geht jedoch nicht, wenn - wie in meinem Beispiel - ein Zyklus im Objektgraph ist. Da muss man sich noch etwas anderes einfallen lassen.

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

22

06.07.2012, 21:04

Danke. Wenn es nützlich wird, werde ich es einbauen ;)

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Thoran

Alter Hase

Beiträge: 520

Wohnort: Stuttgart

Beruf: Senior Software Engineer

  • Private Nachricht senden

23

08.07.2012, 11:54

In deinem Spiel hast du sowas:


C-/C++-Quelltext

C-/C++-Quelltext

1
2
3
4
5
class Enemy
{
private:
    Enemy* wingman; // anderer Gegner, mit dem dieser hier kooperiert
};


Wie speicherst du sowas?


Eine Lösung ist sicher, in eine Klasse eine Serialisierungsmethode einzubauen und diese dann über die eigene Membervariablen laufen zu lassen, um deren Werte in die Datei zu schreiben. Sollte man dabei auf einen Pointer treffen, kann man wiederum dessen Serialisierungsmethode aufrufen. Wenn man die Werte dabei nicht gleich in die Datei schreibt, sondern in eine Speicherstruktur, die die korrekte Sortierung für das Savegamedateiformat vornimmt und entsprechende Referenzen (ID, String) an der Stelle einträgt an der der Pointer gespeichert wurde, dann dürfte damit das Speichern solcher Objekte recht gut funktionieren, mal abgesehen davon das sich garantiert mein erwähntes Vorgehen bezüglich Speicherverbrauch und Performance verbessern läßt.

@Thoran: Ja das ist eine gute Idee. Doch daran hindert mich wxWidgets... Ich wüsste nicht wie ich das grafisch darstellen soll. Kann ich mal sehen wie es bei dir ist?

Ich verwendet C++/Qt für meinen Editor was bereits Klassen für solche Graphen beinhaltet. Damit ist es relative einfach so einen Editor zu schreiben. Aussehen tut das ganze dann so wie im Anhang.
Wenn es dich weiter interessiert, dann kannst du dazu auch auf meinem Blog(Editor/FSM) lesen, was ich alles so während der Entwicklung getan habe.

Thoran
»Thoran« hat folgendes Bild angehängt:
  • SimpleKIGraph.png
Mein Entwicklertagebuch
Aktuelles Projekt: Universum Espionage
Eingestellt:Spieleengine SilverCore
Organisator "Spieleentwickler Stammtisch Stuttgart"

Werbeanzeige