PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 2 Bitten um Speicher-Lade-Datein



SMWma
13.07.2008, 15:49
Ich bins wieder(ìmmer núr ích)
Ich will zwei Sachen (genauer gesagt 6).
Sache eins wäre:
Mit ein Callscript soll gelesen werden, ob im Spieleordner eine Save1.sav Datei ist. Wenn ja, dann soll Switch 2 angehen. Das gleiche nochmal mit einer Save2.sav Datei mit Switch 3 und Save3.sav Datei mit Switch 4...

Zum anderen will ich ein Call-Script, mit den gespeichert wird.
Und das drei mal.
Ein mal mit einer Save1.sav Datei, Save1.sav Datei und Save3.sav Datei!!!
Aber nicht nur so einfach Speichern, sondern soll man dann nachher beim Laden bei einer anderen Karte ist.
Die gewünsche Karte wurde als 5 erstellt und heißt Intro.
Die gewünschten Koordinaten sind 002|000

Hoffe, das mir jemand helfen kann.
Bei Fragen, bitte melden...

-KD-
13.07.2008, 19:13
Ich nehme an du wirst dann auch den Titelbildschirm selbst machen wollen (dort ist ja auch ein Lademenü). Von daher zitier ich mal ein Script, welches ich für derartige Anfragen immer parat habe:

=begin
#===============================================================
Erweitertes Speicher- und Ladesystem
#===============================================================
# Author : Kai
# Version: 0.1
# Datum : 13.07.2008
#===============================================================
Bietet zusätzliche, flexible Funktionen zum Speichern- und Laden, sowie
die Möglichkeit einen eigenen Titelbildschirm zu gestalten.
#---------------------------------------------------------------
* Bedienung
#---------------------------------------------------------------
Anwendung: Titelbildschirm wird automatisch übersprungen. Folgende
Funktionen stehen im "Script..."-Befehl zur Verfügung:

load(n) # => lädt n-ten Spielstand
save(n) # => speichert n-ten Spielstand
delete_savegame(n) # => Löscht n-ten Spielstand
loadmenu # => Öffnet das Lademenü
savemenu # => Äquivalent zum Call Save Befehl
Game_Start.start # => Startet Spiel neu

Bei load und save wird nicht überwacht ob die Spielstände bereits
existieren. Dies kann also ggf. zur Fehlermeldung führen. Man sollte
also vorher mit einem Conditional Branch abfragen ob Spielstände
bereits existieren. Dies geschieht über die ConditionalBranch Scriptanweisung

saved?(n)

die überprüft, ob der n-te Spielstand existiert.
#---------------------------------------------------------------
* Anmerkungen für Skripter
#---------------------------------------------------------------
Wichtig: Vorgehensweise beim Aliasen
Verwendet alias_module_function(neuer_name, alter_name) {
def alter_name
#neue Methodendefinition
end
}
um Aliasing sowohl für Mixins, als auch für Modulfunktion
zu betreiben.

Beispiel: Hinzufügen der Variable $diary beim Abspeichern und Laden

module Game_Save
alias_module_function(:new_saveobjects :saved_objects) {
def saved_objects()
new_saveobjects << $diary
end
}
alias_module_function(:new_loadobjects :loaded_objects) {
def loaded_objects(*args)
$diary = args.pop
loaded_objects(*args)
end
}

=end

#===============================================================
# ** Game_Save (Modul)
#---------------------------------------------------------------
# Speichert Spieldaten ab und lädt diese wieder.
#===============================================================
module Game_Save
FILENAME = "./save" #Dateiname für Spielstand
FILE_EXTENSION = ".rxdata"
SAVE_DIGITS = 1
#Modul kann in Klassen als mixin eingefügt werden um verschiedene
#Save-Klassen (Autosave, Schnellspeichern, ...) zu definieren
module_function()
#---------------------------------------------------------------
# * save :: (filename :: String || Numeric)
# Wird aufgerufen um Spielstand in Datei filename zu speichern
#---------------------------------------------------------------
def save(filename=FILENAME+FILE_EXTENSION)
filename = make_filename(filename) if filename.kind_of?(Numeric)
before_save()
File.open(filename, "wb") {|output|
saved_objects.each {|obj|
Marshal.dump(obj, output)
}
}
after_save()
end
#---------------------------------------------------------------
# * load :: (filename :: String || Numeric)
# Wird aufgerufen um Spielstand in Datei filename zu laden
#---------------------------------------------------------------
def load(filename=FILENAME)
filename = make_filename(filename) if filename.kind_of?(Numeric)
before_load()
obj=[]
File.open(filename, "rb") {|input|
until input.eof? do
obj << Marshal.load(input)
end
}
loaded_objects(*obj)
after_load()
end
#---------------------------------------------------------------
# * delete_savegame :: (filename :: String || Numeric)
# Wird aufgerufen um Datei filename zu löschen
#---------------------------------------------------------------
def delete_savegame(filename=FILENAME)
filename = make_filename(filename) if filename.kind_of?(Numeric)
File.delete(filename) if File.exist?(filename)
end
#---------------------------------------------------------------
# * saved_objects :: () -> Array
# Enthält eine Liste aller abzuspeichernden Objekte
# Alle Elemente müssen per Marshal#dump speicherbar sein
# um Liste zu erweitern aliase die Methode und erweitere den Array
#---------------------------------------------------------------
def saved_objects()
[
$game_party.actors.collect {|a| [a.character_name, a.character_hue]},
Graphics.frame_count,
$game_system,
$game_switches,
$game_variables,
$game_self_switches,
$game_screen,
$game_actors,
$game_party,
$game_troop,
$game_map,
$game_player
]
end
#---------------------------------------------------------------
# * loaded_objects :: (args :: Array)
# Enthält eine Zuweisung der geladenen Objekte zu Variablen
# Kann per aliasing erweitert werden
#---------------------------------------------------------------
def loaded_objects(*args)
chars, Graphics.frame_count, $game_system, $game_switches, $game_variables,
$game_self_switches, $game_screen, $game_actors, $game_party, $game_troop,
$game_map, $game_player = *args
end
#---------------------------------------------------------------
# * before_save, before_load
# Wird aufgerufen, bevor Spielstand gespeichert/geladen wird
#---------------------------------------------------------------
def before_save
$game_system.magic_number = $data_system.magic_number
$game_system.save_count += 1
end
def before_load
#do nothing
end
#---------------------------------------------------------------
# * after_save, after_load
# Wird aufgerufen, nachdem Spielstand gespeichert/geladen wird
#---------------------------------------------------------------
def after_save
#do nothing
end
def after_load
#Wenn Map geändert wurde, lade Map neu
if $game_system.magic_number != $data_system.magic_number then
$game_map.setup($game_map.map_id)
$game_player.center($game_player.x, $game_player.y)
end
#Aktualisiere Spieldaten und starte die Map-Szene
$game_party.refresh()
$game_map.update
$scene = Scene_Map.new()
end
#---------------------------------------------------------------
# * make_filename :: (n :: Numeric) -> String
# erzeugt einen standardmäßigen Dateinamen mit einer Nummer
#---------------------------------------------------------------
def make_filename(n)
FILENAME + sprintf("%0#{SAVE_DIGITS}d", filename) + FILE_EXTENSION
end
#---------------------------------------------------------------
# * saved? :: (filename :: String || Numeric) -> Boolean
# Gibt true zurück wenn Speicherstand existiert, ansonsten false
#---------------------------------------------------------------
def saved?(filename=FILENAME+FILE_EXTENSION)
filename = make_filename(filename) if filename.kind_of?(Numeric)
File.exist?(filename)
end
end
#===============================================================
# ** Game_Start (Modul)
#---------------------------------------------------------------
# Initialisiert Spieldaten
#===============================================================
module Game_Start
# Alle Methoden dürfen auch als Singletonmethoden ausgeführt werden
module_function()
#--------------------------------------------------------------------------
# * Öffne alle Dateien aus der Database und speichere ihren Inhalt
#--------------------------------------------------------------------------
def load_database
$data_actors = load_data("Data/Actors.rxdata")
$data_classes = load_data("Data/Classes.rxdata")
$data_skills = load_data("Data/Skills.rxdata")
$data_items = load_data("Data/Items.rxdata")
$data_weapons = load_data("Data/Weapons.rxdata")
$data_armors = load_data("Data/Armors.rxdata")
$data_enemies = load_data("Data/Enemies.rxdata")
$data_troops = load_data("Data/Troops.rxdata")
$data_states = load_data("Data/States.rxdata")
$data_animations = load_data("Data/Animations.rxdata")
$data_tilesets = load_data("Data/Tilesets.rxdata")
$data_common_events = load_data("Data/CommonEvents.rxdata")
$data_system = load_data("Data/System.rxdata")
end
#--------------------------------------------------------------------------
# * Initialisiere die Elemente des Spiels
#--------------------------------------------------------------------------
def initialize_global_variables
Graphics.frame_count = 0 #Resete Spielzeit
# Erstelle die globalen Variablen
$game_temp = Game_Temp.new
$game_system = Game_System.new
$game_switches = Game_Switches.new
$game_variables = Game_Variables.new
$game_self_switches = Game_SelfSwitches.new
$game_screen = Game_Screen.new
$game_actors = Game_Actors.new
$game_party = Game_Party.new
$game_troop = Game_Troop.new
$game_map = Game_Map.new
$game_player = Game_Player.new
end
#--------------------------------------------------------------------------
# * Initialisiere die Heldentruppe und starte das Spiel
#--------------------------------------------------------------------------
def start_game
# Initialisiere die Heldentruppe
$game_party.setup_starting_members
# Starte die Anfangsmap
$game_map.setup($data_system.start_map_id)
$game_player.moveto($data_system.start_x, $data_system.start_y)
# Starte Spiel
$game_player.refresh
$game_map.autoplay
$game_map.update
$scene = Scene_Map.new
end
#--------------------------------------------------------------------------
# * Wenn per Testkampf gestartet wird, starte Kampf
#--------------------------------------------------------------------------
def start_battle
#Initialisiere Heldentruppe des Testkampfes
$game_party.setup_battle_test_members
# Einstellungen des Testkampfes
$game_temp.battle_troop_id = $data_system.test_troop_id
$game_temp.battle_can_escape = true
$game_map.battleback_name = $data_system.battleback_name
# Musik abspielen
$game_system.se_play($data_system.battle_start_se)
$game_system.bgm_play($game_system.battle_bgm)
# Starte Kampf
$scene = Scene_Battle.new
end

def start
self.load_database
self.initialize_global_variables
if $BTEST then self.start_battle else self.start_game end
end
end
#===============================================================
# ** Module (Klasse)
#---------------------------------------------------------------
# Erweitert die Modul-Klasse um eine neue Alias-Methode
#===============================================================
class Module
def alias_module_function(oldname, newname)
alias_method(oldname, newname)
yield()
module_function(oldname, newname)
end
end
#===============================================================
# ** Scene_Title (Klasse)
#---------------------------------------------------------------
# Überspringt Titel und lädt sofort Spielstand
#===============================================================
class << Scene_Title
include Game_Start
def new()
if @started then
Scene_Map.new
else
@started = true
start #Gib aktuelle Szene (Map) zurück
end
end
end
#===============================================================
# ** Interpreter (Klasse)
#---------------------------------------------------------------
# erweitert Interpreter um neue Befehle
#===============================================================
class Interpreter
include Game_Save #mache alle Game_Save Methoden verfügbar
def loadmenu
$scene = Scene_Load.new
end
def savemenu
$scene = Scene_Save.new
end
end
Nun kannst du mit dem Script... Befehl folgende Sachen ausführen: (das #... sind immer Kommentare, die weggelassen werden dürfen)

load(1) #Lädt ersten Spielstand
save(1) #Speichert ersten Spielstand
delete_savegame(1) #löscht ersten Spielstand

Die Befehle load und save achten nicht darauf, ob der Spielstand bereits existiert! Sie rufen also eine Fehlermeldung auf, wenn die Spielstände noch nicht da sind. Daher solltest du vorher in einem Conditional Branch überprüfen ob die Spielstände überhaupt existieren. Das tust du ebenfalls mit dem Script-Befehl im ConditionalBranch-Fenster. Dort schreibst du

saved?(1)
Um herauszufinden, ob der Spielstand 1 existiert.

Für die übrigen Wünsche bedarf es noch einiger Erweiterungen, die du unter das Script einfügst.

module Game_Save
module_function()
#Wir wollen nach dem Laden auf der Map 5 an Position 2/0 landen
def after_load
$game_party.refresh()
$game_map.setup(5)
$game_player.moveto(2, 0)
$game_player.refresh()
$game_map.update()
$game_map.autoplay()
$scene = Scene_Map.new()
end
end

SMWma
13.07.2008, 19:42
Funktioniert nicht.
Hab es einmal in Main einmal über Main probiert...

PS:
Das mit denn Laden auf Map 5 Koordinaten 000|002 meinte ich nur, wenn Switch 5 an ist.

SMWma
10.01.2009, 23:48
wie gesagt, funktioniert das erste Script nicht.
~Push~