Lysop

Schlitzohr

  • »Lysop« ist der Autor dieses Themas

Motto: So lasset uns kein Trübsal sinnieren und gar königlich dinieren!

  • Nachricht senden

1

Sonntag, 21. Juli 2013, 01:28

Write und Read

Bevor ein Savefile über den Ladescreen gelesen wird, wird dies (Ausschnitt) über ein Menü im Titlescreen durchgeführt:

Ruby Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#Wird im Titelbildschirm geladen und funktioniert nur, wenn nicht
#wie unten ein Spielstand überschrieben wird.
              if FileTest.exist?("Save#{index}.rvdata")
                file = File.open("Save#{index}.rvdata", "rb")
                characters           = Marshal.load(file)
                Graphics.frame_count = Marshal.load(file)
                @last_bgm            = Marshal.load(file)
                @last_bgs            = Marshal.load(file)
                $game_system         = Marshal.load(file)
                $game_message        = Marshal.load(file)
                $game_switches       = Marshal.load(file)
                $game_variables      = Marshal.load(file)
                $game_self_switches  = Marshal.load(file)
                $game_actors         = Marshal.load(file)
                $game_party          = Marshal.load(file)
                $game_troop          = Marshal.load(file)
                $game_map            = Marshal.load(file)
                $game_player         = Marshal.load(file)
                $Erfolge_erhalten = Marshal.load(file)
                file.close
              end


Der letzte Eintrag wird auch korrekt geladen, vorausgesetzt es wird nicht wie unten auf einem Savefile geschrieben.
Falls doch, werden diese Objekte nicht mehr korrekt geladen.

Ruby Quellcode

1
2
3
4
5
6
7
8
9
10
11
#Wird während des Spiels geschrieben. Anschließend läuft der Code
#oben nicht mehr richtig.
  alias file_write_save_data write_save_data
  def write_save_data(file)
    file_write_save_data(file)
    Marshal.dump($game_monsters, file)
    Marshal.dump($game_allies,   file)
    Marshal.dump($game_range,    file)
    Marshal.dump($game_drop,     file)
    Marshal.dump($game_bomb,     file)
  end

Ich vermute es liegt daran, dass mehrere Objekte auf einmal gespeichert werden sollen.
Aber ich bin etwas ratlos.
Das ist jedenfalls der relevante Code, aber falls ihr mehr braucht, sagt bescheid!
  • :cake: So lasset uns beginnen! :new:

    • Ein Abenteuer, wie du es noch nie erlebt hast!
      Tauche ein in die wunderbare Welt des Königs und erlebe auf deiner Reise die verrücktesten Dinge!
      NICHT MEHR LANGE! :navigation-right: Hier gibt es weitere Informationen! :navigation-left:
    • Jetzt die Demo herunterladen!
      Bild
      Euch erwartet eine Welt, wie sie nur ein exzentrischer König veralbern könnte...
    • Titelbild
      Bild
  • :fires: XBOX 360 Bild

    Bild
  • :new: Avatar im Großformat

    Bild

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Lysop« (21. Juli 2013, 11:27)


Irrlicht

Leuchtendes Irgendwas

Motto: Keep shining!

  • Nachricht senden

2

Sonntag, 21. Juli 2013, 12:14

Die Reihenfolge in der die Objekte durch Marshal.load geladen werden entspricht der Reihenfolge in der sie vorher in die Datei geschrieben wurden.

Wenn das Problem daran liegen sollte dass $Erfolge_erhalten nun das Objekt von $game_monsters erhält versuch mal die Scripts so umzusortieren dass das Script mit dem ersten Ausschnitt über dem mit dem zweiten Ausschnitt liegt.

Lysop

Schlitzohr

  • »Lysop« ist der Autor dieses Themas

Motto: So lasset uns kein Trübsal sinnieren und gar königlich dinieren!

  • Nachricht senden

3

Sonntag, 21. Juli 2013, 12:19

Dann liegt es wohl am ersten. In $game_monsters ist nichts von $Erfolge_erhalten enthalten und anders herum auch nicht.
D.h. die Reihenfolge ist wohl irgendwie durcheinander geraten.
Ist es denn möglich die Aliase von write_save_data aus den Scripten zu entfernen und alles in ein großes write_save_data zu stecken, sodass in einer bestimmten Reihenfolge geschrieben (und geladen) wird?

Z.B. dass ich einfach alles in die Original write_save_data und read_save_data schreibe und zwar in der richtigen Reihenfolge. Die Aliase lösche ich dann alle raus.
Ist das eine gute Lösung, bis auf die Tatsache, dass ich im Original schreibe?
  • :cake: So lasset uns beginnen! :new:

    • Ein Abenteuer, wie du es noch nie erlebt hast!
      Tauche ein in die wunderbare Welt des Königs und erlebe auf deiner Reise die verrücktesten Dinge!
      NICHT MEHR LANGE! :navigation-right: Hier gibt es weitere Informationen! :navigation-left:
    • Jetzt die Demo herunterladen!
      Bild
      Euch erwartet eine Welt, wie sie nur ein exzentrischer König veralbern könnte...
    • Titelbild
      Bild
  • :fires: XBOX 360 Bild

    Bild
  • :new: Avatar im Großformat

    Bild

Irrlicht

Leuchtendes Irgendwas

Motto: Keep shining!

  • Nachricht senden

4

Sonntag, 21. Juli 2013, 12:42

Kannst du machen.
Alias wird ja meist verwendet um sicherzustellen dass es zu keinen Überschneidungen kommt wenn ein unbekanntes Script die selbe Methode überschreibt.
Da du ja weißt wie write_save_data auszusehen hat sollte es keine Probleme geben.
Du solltest natürlich daran denken die entsprechenden Stellen wieder herauszunehmen wenn du eines der Scripte nicht mehr brauchst.


Andererseits passieren Änderungen an write_save_data eig. immer analog zu load_save_data, d.h. wenn ersteres erweitert wird um weitere Objekte zu speichern kannst du davon ausgehen dass zweiteres sie an dieser Stelle wieder laden wird.

Ohne deinen Code zu kennen würde ich daher vermuten dass du mit

Ruby Quellcode

1
2
3
4
5
if File.exist?("Save#{index}.rvdata")
  File.open("Save#{index}.rvdata", "rb") do |file| 
    Scene_File.new.read_save_data(file)
  end
end

deinen ersten Codeausschnitt ersetzen könntest um alle Daten in der richtigen Reihenfolge zu laden.
Das bleibt allerdings eine Vermutung da ich deinen Code nicht kenne.

Lysop

Schlitzohr

  • »Lysop« ist der Autor dieses Themas

Motto: So lasset uns kein Trübsal sinnieren und gar königlich dinieren!

  • Nachricht senden

5

Sonntag, 21. Juli 2013, 12:58

Ruby Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
  #--------------------------------------------------------------------------
  # * Write Save Data
  #     file : write file object (opened)
  #--------------------------------------------------------------------------
  def write_save_data(file)
    characters = []
    for actor in $game_party.members
      characters.push([actor.character_name, actor.character_index])
    end
    $game_system.save_count += 1
    $game_system.version_id = $data_system.version_id
    @last_bgm = RPG::BGM::last
    @last_bgs = RPG::BGS::last
    Marshal.dump(characters,           file)
    Marshal.dump(Graphics.frame_count, file)
    Marshal.dump(@last_bgm,            file)
    Marshal.dump(@last_bgs,            file)
    Marshal.dump($game_system,         file)
    Marshal.dump($game_message,        file)
    Marshal.dump($game_switches,       file)
    Marshal.dump($game_variables,      file)
    Marshal.dump($game_self_switches,  file)
    Marshal.dump($game_actors,         file)
    Marshal.dump($game_party,          file)
    Marshal.dump($game_troop,          file)
    Marshal.dump($game_map,            file)
    Marshal.dump($game_player,         file)
    Marshal.dump($Erfolge_erhalten, file)
    Marshal.dump($game_monsters, file)
    Marshal.dump($game_allies,   file)
    Marshal.dump($game_range,    file)
    Marshal.dump($game_drop,     file)
    Marshal.dump($game_bomb,     file)
  end
  #--------------------------------------------------------------------------
  # * Read Save Data
  #     file : file object for reading (opened)
  #--------------------------------------------------------------------------
  def read_save_data(file)
    characters           = Marshal.load(file)
    Graphics.frame_count = Marshal.load(file)
    @last_bgm            = Marshal.load(file)
    @last_bgs            = Marshal.load(file)
    $game_system         = Marshal.load(file)
    $game_message        = Marshal.load(file)
    $game_switches       = Marshal.load(file)
    $game_variables      = Marshal.load(file)
    $game_self_switches  = Marshal.load(file)
    $game_actors         = Marshal.load(file)
    $game_party          = Marshal.load(file)
    $game_troop          = Marshal.load(file)
    $game_map            = Marshal.load(file)
    $game_player         = Marshal.load(file)
    $Erfolge_erhalten = Marshal.load(file)
    $game_monsters = Marshal.load(file)
    $game_allies   = Marshal.load(file)
    $game_range    = Marshal.load(file)
    $game_drop     = Marshal.load(file)
    $game_bomb     = Marshal.load(file)
    if $game_system.version_id != $data_system.version_id
      $game_map.setup($game_map.map_id)
      $game_player.center($game_player.x, $game_player.y)
    end
  end


So habe ich jetzt die Originale überschrieben.

Der erste Ausschnitt aus meinem ersten Post sieht noch genauso aus. Aber ich vermute mal, dass er nun 2 mal dasselbe lädt. Einmal im Original und einmal im Ausschnitt.
Jedenfalls funktioniert es jetzt. Es gibt noch ein weiteres Script bei mir, das ebenfalls mehrmals schreibt. Es macht aber komischerweise keine Probleme.
Ist es sicherer, am besten alles in das Original zu verschieben?
  • :cake: So lasset uns beginnen! :new:

    • Ein Abenteuer, wie du es noch nie erlebt hast!
      Tauche ein in die wunderbare Welt des Königs und erlebe auf deiner Reise die verrücktesten Dinge!
      NICHT MEHR LANGE! :navigation-right: Hier gibt es weitere Informationen! :navigation-left:
    • Jetzt die Demo herunterladen!
      Bild
      Euch erwartet eine Welt, wie sie nur ein exzentrischer König veralbern könnte...
    • Titelbild
      Bild
  • :fires: XBOX 360 Bild

    Bild
  • :new: Avatar im Großformat

    Bild

Irrlicht

Leuchtendes Irgendwas

Motto: Keep shining!

  • Nachricht senden

6

Sonntag, 21. Juli 2013, 13:54

Sicherer - Jain, in den meisten Fällen ist die genaue Speicherreihenfolge ja unerheblich solange in der gleichen Reihenfolge geladen wie gespeichert wird.
Das Aufteilen in mehrere Abschnitte hat dabei auch den Vorteil dass du einzelne Scripts einfach hinzufügen/entfernen kannst ohne dass du etwas an den Methoden anpassen musst.

Dass ein Codestück in einem Script mehrfach vorkommt bedeutet nicht unbedingt dass es öfter ausgeführt wird. Mit

Ruby Quellcode

1
2
3
10000.times do
  File.open("Save#{index}.rvdata", "rb") { |f| Scene_File.new.read_save_data(f) }
end
lade ich 10000 mal eine Datei obwohl der zugehörige Code nur einmal definiert wurde.

Das Laden ist dabei auch ein abgeschlossener Vorgang:
Mit file = File.open(...) erstellst du ein neues Leseobjekt, das am Anfang der Datei anfangen wird zu lesen. Mit jedem Zugriff wird es dann da weiterlesen wo es nach dem letzten Zugriff aufgehört hat bis das Ende der Datei erreicht ist.
Das Ende des Auslesens markiert meist file.close, womit die Datei wieder freigegeben wird.
Bei jedem erneuten Öffnen der Datei wird entsprechend wieder am Anfang angefangen.

Lysop

Schlitzohr

  • »Lysop« ist der Autor dieses Themas

Motto: So lasset uns kein Trübsal sinnieren und gar königlich dinieren!

  • Nachricht senden

7

Sonntag, 21. Juli 2013, 14:15

Die zwei aus meinem ersten Post haben ja scheinbar Probleme gehabt mit der Reihenfolge.
So ganz klar geworden ist mir noch nicht, ob solche Probleme willkürlich auftauchen, oder nur beim ersten Schreiben und Laden auf einen Savefile.
  • :cake: So lasset uns beginnen! :new:

    • Ein Abenteuer, wie du es noch nie erlebt hast!
      Tauche ein in die wunderbare Welt des Königs und erlebe auf deiner Reise die verrücktesten Dinge!
      NICHT MEHR LANGE! :navigation-right: Hier gibt es weitere Informationen! :navigation-left:
    • Jetzt die Demo herunterladen!
      Bild
      Euch erwartet eine Welt, wie sie nur ein exzentrischer König veralbern könnte...
    • Titelbild
      Bild
  • :fires: XBOX 360 Bild

    Bild
  • :new: Avatar im Großformat

    Bild

Ähnliche Themen

Social Bookmarks