Spielstände speichern und laden

Aus Spieleprogrammierer-Wiki
(Unterschied zwischen Versionen)
Wechseln zu: Navigation, Suche
[gesichtete Version][gesichtete Version]
(Einleitung)
(Das Dateiformat des Spielstandes)
 
(10 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 2: Zeile 2:
 
[[Kategorie:Game-Design]]
 
[[Kategorie:Game-Design]]
  
== Einleitung ==
 
 
Die Speicherfunktion in Spielen mag auf den ersten Blick trivial erscheinen, ist sie aber bei Weitem nicht. Die Art und Weise wie das Spiel gespeichert werden kann, nimmt starken Einfluss auf die Motivation des Spielers. Sind die Spielabschnitte zu groß ohne dass der Spieler abspeichern kann, führt das schnell zu Frustration, weil der Spieler immer wieder von vorne anfangen muss. Im Gegensatz dazu kann eine immer und überall verfügbare Speicherfunktion das Spiel zu leicht machen, und auch das kann dazu führen, dass der Spielspaß leidet. Aus diesen Gründen sollte man sich bewusst Gedanken über die Speicherfunktion seines Spiels machen.
 
Die Speicherfunktion in Spielen mag auf den ersten Blick trivial erscheinen, ist sie aber bei Weitem nicht. Die Art und Weise wie das Spiel gespeichert werden kann, nimmt starken Einfluss auf die Motivation des Spielers. Sind die Spielabschnitte zu groß ohne dass der Spieler abspeichern kann, führt das schnell zu Frustration, weil der Spieler immer wieder von vorne anfangen muss. Im Gegensatz dazu kann eine immer und überall verfügbare Speicherfunktion das Spiel zu leicht machen, und auch das kann dazu führen, dass der Spielspaß leidet. Aus diesen Gründen sollte man sich bewusst Gedanken über die Speicherfunktion seines Spiels machen.
  
 
== Arten Spielstände zu speichern  ==
 
== Arten Spielstände zu speichern  ==
  
In diesem Abschnitt gibt es ein Überblick über die Möglichkeiten Spielfortschritte zu speichern.
+
In diesem Abschnitt gibt es einen Überblick über die Möglichkeiten Spielfortschritte zu speichern.
  
 
=== Level-Code ===
 
=== Level-Code ===
 
Eine sehr einfache Methode den Spielfortschritt festzuhalten ist der Level-Code. Solch ein Code besteht meistens aus Zahlen, Buchstaben oder (Spiel-)Symbolen. Er fand besonders zu Beginn der Spieleentwicklung oft Verwendung in Jump and Run-Spielen, Denkspielen oder Strategiespielen. Typische Vertreter sind [http://de.wikipedia.org/wiki/Mega_lo_Mania Mega lo Mania], [http://de.wikipedia.org/wiki/Battle_Isle Battle Isle], [http://de.wikipedia.org/wiki/Pushover Push Over] oder [http://de.wikipedia.org/wiki/Gods Gods].
 
Eine sehr einfache Methode den Spielfortschritt festzuhalten ist der Level-Code. Solch ein Code besteht meistens aus Zahlen, Buchstaben oder (Spiel-)Symbolen. Er fand besonders zu Beginn der Spieleentwicklung oft Verwendung in Jump and Run-Spielen, Denkspielen oder Strategiespielen. Typische Vertreter sind [http://de.wikipedia.org/wiki/Mega_lo_Mania Mega lo Mania], [http://de.wikipedia.org/wiki/Battle_Isle Battle Isle], [http://de.wikipedia.org/wiki/Pushover Push Over] oder [http://de.wikipedia.org/wiki/Gods Gods].
  
In der Regel wird für jeden durchgespielten Level ein Code freigeschaltet. Möchte der Spieler das Spiel fortsetzen, so gibt er den entsprechenden Code ein. Genau genommen wird hierbei nichts gespeichert. Gewissermaßen wird das Speichern der Daten auf den Spieler ausgelagert, der sich den Code auf einem Zettel oder in einer Datei merkt. Darum wurde diese Methode oft von Konsolenspielen angewendet, die (aus Kostengründen) keinen wiederbeschreibbaren Speicher auf ihrer Catridge zur Verfügung hatten. Es ist möglich, im Level-Code gewisse einfache Informationen wie die Punktzahl des Spielers versteckt zu kodieren (eine Prüfsumme schützt gegen einfache Manipulationsversuche). Auch für Spiele, die keine Daten auf dem Rechner des Spielers ablegen möchten oder dürfen, ist der Level-Code eine Alternative (z.B. Flash-Spiele).
+
In der Regel wird für jeden durchgespielten Level ein Code freigeschaltet. Möchte der Spieler das Spiel fortsetzen, so gibt er den entsprechenden Code ein. Genau genommen wird hierbei nichts gespeichert. Gewissermaßen wird das Speichern der Daten auf den Spieler ausgelagert, der sich den Code auf einem Zettel oder in einer Datei merkt. Darum wurde diese Methode oft von Konsolenspielen angewendet, die (aus Kostengründen) keinen wiederbeschreibbaren Speicher auf ihrer Catridge zur Verfügung hatten. Es ist möglich, im Level-Code gewisse einfache Informationen wie die Punktzahl des Spielers versteckt zu kodieren (eine Prüfsumme schützt gegen einfache Manipulationsversuche). Auch für Spiele, die keine Daten auf dem Rechner des Spielers ablegen möchten oder dürfen, ist der Level-Code eine Alternative (z. B. Flash-Spiele).
  
 
Die Vorteile von Level-Codes liegen in der einfachen Implementierung und darin, dass keine Daten auf dem Rechner abgelegt werden müssen. Der Spieler kann seinen Spielstand von überall aus wiederherstellen, solange er den Level-Code kennt.
 
Die Vorteile von Level-Codes liegen in der einfachen Implementierung und darin, dass keine Daten auf dem Rechner abgelegt werden müssen. Der Spieler kann seinen Spielstand von überall aus wiederherstellen, solange er den Level-Code kennt.
Zeile 19: Zeile 18:
  
 
=== Speicherpunkte ===
 
=== Speicherpunkte ===
Speicherpunkte geben dem Spieler die Möglichkeit, den aktuellen Spielstand, nur an bestimmten Stellen des Spiels zu speichern. Die Implementierung in das Spiel kann dabei aber sehr unterschiedlich sein. Eine Variante kann z.B. sein, wie im Spiel [http://de.wikipedia.org/wiki/Final_Fantasy_XII Final Fantasy XII], an gewissen Stellen in einer frei begehbaren Spielwelt Speicherpunkte zu setzen. Eine andere Variante könnte es sein den Spieler zu fragen ob er nach einem gewissen Levelabschnitt abspeichern möchte, wie im Spiel [http://de.wikipedia.org/wiki/Super_Mario_World Super Mario World].
+
Speicherpunkte geben dem Spieler die Möglichkeit, den aktuellen Spielstand, nur an bestimmten Stellen des Spiels zu speichern. Die Implementierung in das Spiel kann dabei aber sehr unterschiedlich sein. Eine Variante kann z. B. sein, wie im Spiel [http://de.wikipedia.org/wiki/Final_Fantasy_XII Final Fantasy XII], an gewissen Stellen in einer frei begehbaren Spielwelt Speicherpunkte zu setzen. Eine andere Variante könnte es sein, den Spieler zu fragen, ob er nach einem gewissen Levelabschnitt abspeichern möchte, wie im Spiel [http://de.wikipedia.org/wiki/Super_Mario_World Super Mario World].
  
In jedem Fall sollte bei dieser Methode darauf geachtet werden, das ausreichend Speicherpunkte vorhanden sind.
+
In jedem Fall sollte bei dieser Methode darauf geachtet werden, dass ausreichend Speicherpunkte vorhanden sind.
  
 
==== Freies Speichern ====
 
==== Freies Speichern ====
Zeile 35: Zeile 34:
  
 
==== Quicksave ====
 
==== Quicksave ====
Die Quicksave-Funktion speichert das Spiel komfortabel über eine Taste oder Tastenkombination ab. Das ermöglicht dem Spieler ein schnelle Speicherung ohne den Spielfluss zu unterbrechen. Meistens ist für diese Funktion ein bestimmter Speicherplatz reserviert, der dann immer wieder überschrieben wird.
+
Die Quicksave-Funktion speichert das Spiel komfortabel über eine Taste oder Tastenkombination ab. Das ermöglicht dem Spieler eine schnelle Speicherung ohne den Spielfluss zu unterbrechen. Meistens ist für diese Funktion ein bestimmter Speicherplatz reserviert, der dann immer wieder überschrieben wird.
  
 
==== Autosave ====
 
==== Autosave ====
Zeile 41: Zeile 40:
  
 
== Speicherfunktion als Teil des Spielkonzepts ==
 
== Speicherfunktion als Teil des Spielkonzepts ==
Der Schwierigkeitsgrad eines Spiels kann auch durch die Speicherfunktion beeinflusst werden. In einem Rollenspiel zum Beispiel kann das Abspeichern, im Schwierigkeitsgrad "leicht", immer und überall erfolgen. Wechselt der Spieler jedoch in den Schwierigkeitsgrad "mittel", kann es z.B. nur noch in gewissen Gebieten im Spiel möglich sein abzuspeichern. Im Schwirigkeitsgrad "schwer" wird das Spiel dann nur noch beim Beenden des Spiels gespeichert. All das lässt sich natürlich auch auf andere Genres übertragen.
+
Der Schwierigkeitsgrad eines Spiels kann auch durch die Speicherfunktion beeinflusst werden. In einem Rollenspiel zum Beispiel kann das Abspeichern, im Schwierigkeitsgrad "leicht", immer und überall erfolgen. Wechselt der Spieler jedoch in den Schwierigkeitsgrad "mittel", kann es z. B. nur noch in gewissen Gebieten im Spiel möglich sein abzuspeichern. Im Schwirigkeitsgrad "schwer" wird das Spiel dann nur noch beim Beenden des Spiels gespeichert. All das lässt sich natürlich auch auf andere Genres übertragen.
  
 
== Die Ladefunktion ==
 
== Die Ladefunktion ==
Die Möglichkeit das Spiel wieder herzustellen sollte im Hauptmenü implementiert werden. So kann direkt nach Spielstart, ohne große Umwege, das Spiel geladen werden. Wenn es zum Spielkonzept passt, kann es auch eine Ladefunktion im eigentlichen Spiel geben, um schnell und bequem einen alten Spielstand wiederherzustellen.
+
 
 +
Die Ladefunktion hat die Aufgabe, den gespeicherten Spielstand einzulesen, auf Gültigkeit zu überprüfen (beschädigte oder manipulierte Daten sollten erkannt werden) und ihn wiederherzustellen. Wie dies konkret umgesetzt wird, hängt selbstverständlich vom jeweiligen Spiel ab.
 +
 
 +
Die Möglichkeit, den Spielstand zu laden, sollte im Hauptmenü implementiert werden. So kann direkt nach Spielstart, ohne große Umwege, das Spiel geladen werden. Wenn es zum Spielkonzept passt, kann es auch eine Ladefunktion im eigentlichen Spiel geben, um schnell und bequem einen alten Spielstand wiederherzustellen.
  
 
== Das Dateiformat des Spielstandes ==
 
== Das Dateiformat des Spielstandes ==
Zeile 53: Zeile 55:
  
 
Generell ist es natürlich immer möglich, die Spielstandsdaten zu verschlüsseln und/oder mit einer [http://de.wikipedia.org/wiki/Prüfsumme Prüfsumme] zu versehen. Das Entschlüsselungs-/Prüfsummenverfahren bzw. der Schlüssel müssen jedoch irgendwo im Programm gespeichert werden. Verschlüsselung und Prüfsumme vergrößern in jedem Fall den Aufwand, den ein Angreifer treiben muss, um Spielstände manipulieren zu können.
 
Generell ist es natürlich immer möglich, die Spielstandsdaten zu verschlüsseln und/oder mit einer [http://de.wikipedia.org/wiki/Prüfsumme Prüfsumme] zu versehen. Das Entschlüsselungs-/Prüfsummenverfahren bzw. der Schlüssel müssen jedoch irgendwo im Programm gespeichert werden. Verschlüsselung und Prüfsumme vergrößern in jedem Fall den Aufwand, den ein Angreifer treiben muss, um Spielstände manipulieren zu können.
 +
 +
Unabhängig vom gewählten Dateiformat sollte grundsätzlich immer eine ''Versionsnummer'' mitgespeichert werden. Dies erleichtert es, Änderungen am Dateiformat durchzuführen (z. B. nach einem Spiel-Update) und veraltete Dateien zu erkennen und ggf. gesondert zu behandeln.
  
 
=== XML ===
 
=== XML ===
Zeile 75: Zeile 79:
  
 
XML-Dateien enthalten im Allgemeinen viel Redundanz und Overhead und benötigen daher viel Speicherplatz. Daher ist es üblich, XML-Dateien zu komprimieren oder auf eine binäre Variante auszuweichen [http://de.wikipedia.org/wiki/Binary_XML]. Dadurch gehen die Vorteile von XML jedoch zu einem gewissen Grad wieder verloren.
 
XML-Dateien enthalten im Allgemeinen viel Redundanz und Overhead und benötigen daher viel Speicherplatz. Daher ist es üblich, XML-Dateien zu komprimieren oder auf eine binäre Variante auszuweichen [http://de.wikipedia.org/wiki/Binary_XML]. Dadurch gehen die Vorteile von XML jedoch zu einem gewissen Grad wieder verloren.
 +
 +
===XDS===
 +
XDS basiert auf XML, ist im Unterschied dazu allerdings binär und eignet sich so in für eine sicherere Speicherung von Spieldaten. Es ist für kleine Dateigrößen und schnelle Auslesezeiten optimiert und verbindet somit die Vorteile von XML mit denen von Binären Formaten. Genaueres dazu in Game Programming Gems 4.
  
 
=== YAML ===
 
=== YAML ===
Zeile 101: Zeile 108:
  
 
Zudem kann es bedingt in andere textuelle und teilweise in binäre Formate eingebettet werden. Ein Beispiel für ein textuelles Format wäre XML, bei dem die Elemente fast beliebigen Text enthalten können und ein Beispiel für ein binäres Format wäre eine Datenbank. Auch wenn es möglich ist, sollte man in der Praxis davon abstand nehmen, Daten im CSV Format in einer Datenbank zu speichern, da dies ein Hinweis für eine schlechte Normalisierung wäre. Bei anderen Formaten stellen diese Formate selbst in der Regel entsprechende Konstrukte bereit, mit denen die Daten gespeichert werden können. Somit sollte eine Einbettung eine Ausnahmesituation darstellen.
 
Zudem kann es bedingt in andere textuelle und teilweise in binäre Formate eingebettet werden. Ein Beispiel für ein textuelles Format wäre XML, bei dem die Elemente fast beliebigen Text enthalten können und ein Beispiel für ein binäres Format wäre eine Datenbank. Auch wenn es möglich ist, sollte man in der Praxis davon abstand nehmen, Daten im CSV Format in einer Datenbank zu speichern, da dies ein Hinweis für eine schlechte Normalisierung wäre. Bei anderen Formaten stellen diese Formate selbst in der Regel entsprechende Konstrukte bereit, mit denen die Daten gespeichert werden können. Somit sollte eine Einbettung eine Ausnahmesituation darstellen.
 
=== Text ===
 
  
 
=== Datenbank ===
 
=== Datenbank ===
 +
 +
Auch eine Datenbank kann dazu verwendet werden, gespeicherte Spielstände zu verwalten. Dabei können Features von Datenbankmanagementsystemen genutzt werden, um das Laden und Speichern effizient oder besonders robust zu gestalten.
  
 
==== Manipulierbarkeit ====
 
==== Manipulierbarkeit ====
Zeile 111: Zeile 118:
  
 
=== Eigenes binäres Format ===
 
=== Eigenes binäres Format ===
 +
 +
Ein eigenes binäres Format folgt keinem Dateiformatstandard.
  
 
==== Manipulierbarkeit ====
 
==== Manipulierbarkeit ====
  
 
Da eigene binäre Formate nicht verbreitet sind, stellen diese grundsätzlich den besten Schutz gegen Manipulationen dar. Allerdings sollte man sich vor Augen halten, dass auch dieses Format analysiert werden kann und dadurch der Schutz nach einer gewissen Zeit nicht mehr zwingend gegeben ist.
 
Da eigene binäre Formate nicht verbreitet sind, stellen diese grundsätzlich den besten Schutz gegen Manipulationen dar. Allerdings sollte man sich vor Augen halten, dass auch dieses Format analysiert werden kann und dadurch der Schutz nach einer gewissen Zeit nicht mehr zwingend gegeben ist.
 +
 +
== Version des Spielstandes ==
 +
Im laufe der Zeit kommt es vor, dass ein Spiel abgeändert wird. Ein Update um die Grafik zu verbessern oder um einen Bug zu fixen oder aber eine Änderung der Lade- und Speicherfunktion für die Spielstände. Dies kann bedeuten das mehr oder weniger Informationen in dem Spielstand gespeichert werden müssen. Für solche Fälle ist es angebracht in dem Spielstand eine Versionnummer zu speichern. Eine Versionsnummer kann verhindern das ältere Spielstände geladen werden und möglicherweise Probleme verusachen.
 +
 +
Aus der Sicht des Spieler ist es natürlich frustrierend ein Spiel wieder neu anfangen zu müssen, weil der Spielstand nicht mehr geladen wird. Diesem Problem kann der Programmierer leicht entgegenwirken. Eine Möglichkeit ist es, die Versionsnummer des Spielstandes zu ermitteln und für jede Version eine Angepasste Laderoutine zu implementieren. Eine andere herangehensweis an das Problem kann sein, einen Spielstandkonverter zu schreiben und so den alten Spielstand der neuen Ladefunktion anzupassen.
  
 
== Quellen zum Durchlesen ==
 
== Quellen zum Durchlesen ==

Aktuelle Version vom 11. September 2012, 18:19 Uhr

Klicke hier, um diese Version anzusehen.

Meine Werkzeuge
Namensräume
Varianten
Aktionen
Navigation
Werkzeuge