mirror of
https://github.com/godotengine/godot-docs.git
synced 2026-01-04 14:11:02 +03:00
Merge pull request #2843 from nekomatata/tutorial-saving-games
Improvements in "Saving Games" tutorial
This commit is contained in:
@@ -141,8 +141,21 @@ way to pull the data out of the file as well.
|
||||
var save_game = File.new()
|
||||
save_game.open("user://savegame.save", File.WRITE)
|
||||
var save_nodes = get_tree().get_nodes_in_group("Persist")
|
||||
for i in save_nodes:
|
||||
var node_data = i.call("save");
|
||||
for node in save_nodes:
|
||||
# Check the node is an instanced scene so it can be instanced again during load
|
||||
if node.filename.empty():
|
||||
print("persistent node '%s' is not an instanced scene, skipped" % node.name)
|
||||
continue
|
||||
|
||||
# Check the node has a save function
|
||||
if !node.has_method("save"):
|
||||
print("persistent node '%s' is missing a save() function, skipped" % node.name)
|
||||
continue
|
||||
|
||||
# Call the node's save function
|
||||
var node_data = node.call("save")
|
||||
|
||||
# Store the save dictionary as a new line in the save file
|
||||
save_game.store_line(to_json(node_data))
|
||||
save_game.close()
|
||||
|
||||
@@ -160,7 +173,24 @@ way to pull the data out of the file as well.
|
||||
var saveNodes = GetTree().GetNodesInGroup("Persist");
|
||||
foreach (Node saveNode in saveNodes)
|
||||
{
|
||||
// Check the node is an instanced scene so it can be instanced again during load
|
||||
if (saveNode.Filename.Empty())
|
||||
{
|
||||
GD.Print(String.Format("persistent node '{0}' is not an instanced scene, skipped", saveNode.Name));
|
||||
continue;
|
||||
}
|
||||
|
||||
// Check the node has a save function
|
||||
if (!saveNode.HasMethod("Save"))
|
||||
{
|
||||
GD.Print(String.Format("persistent node '{0}' is missing a Save() function, skipped", saveNode.Name));
|
||||
continue;
|
||||
}
|
||||
|
||||
// Call the node's save function
|
||||
var nodeData = saveNode.Call("Save");
|
||||
|
||||
// Store the save dictionary as a new line in the save file
|
||||
saveGame.StoreLine(JSON.Print(nodeData));
|
||||
}
|
||||
|
||||
@@ -195,20 +225,20 @@ load function:
|
||||
# Load the file line by line and process that dictionary to restore
|
||||
# the object it represents.
|
||||
save_game.open("user://savegame.save", File.READ)
|
||||
while not save_game.eof_reached():
|
||||
var current_line = parse_json(save_game.get_line())
|
||||
if current_line == null:
|
||||
continue
|
||||
while save_game.get_position() < save_game.get_len():
|
||||
# Get the saved dictionary from the next line in the save file
|
||||
var node_data = parse_json(save_game.get_line())
|
||||
|
||||
# Firstly, we need to create the object and add it to the tree and set its position.
|
||||
var new_object = load(current_line["filename"]).instance()
|
||||
get_node(current_line["parent"]).add_child(new_object)
|
||||
new_object.position = Vector2(current_line["pos_x"], current_line["pos_y"])
|
||||
var new_object = load(node_data["filename"]).instance()
|
||||
get_node(node_data["parent"]).add_child(new_object)
|
||||
new_object.position = Vector2(node_data["pos_x"], node_data["pos_y"])
|
||||
|
||||
# Now we set the remaining variables.
|
||||
for i in current_line.keys():
|
||||
for i in node_data.keys():
|
||||
if i == "filename" or i == "parent" or i == "pos_x" or i == "pos_y":
|
||||
continue
|
||||
new_object.set(i, current_line[i])
|
||||
new_object.set(i, node_data[i])
|
||||
save_game.close()
|
||||
|
||||
.. code-tab:: csharp
|
||||
@@ -233,20 +263,19 @@ load function:
|
||||
// it represents.
|
||||
saveGame.Open("user://savegame.save", (int)File.ModeFlags.Read);
|
||||
|
||||
while (!saveGame.EofReached())
|
||||
while (saveGame.GetPosition() < save_game.GetLen())
|
||||
{
|
||||
var currentLine = (Dictionary<object, object>)JSON.Parse(saveGame.GetLine()).Result;
|
||||
if (currentLine == null)
|
||||
continue;
|
||||
// Get the saved dictionary from the next line in the save file
|
||||
var nodeData = (Dictionary<object, object>)JSON.Parse(saveGame.GetLine()).Result;
|
||||
|
||||
// Firstly, we need to create the object and add it to the tree and set its position.
|
||||
var newObjectScene = (PackedScene)ResourceLoader.Load(currentLine["Filename"].ToString());
|
||||
var newObjectScene = (PackedScene)ResourceLoader.Load(nodeData["Filename"].ToString());
|
||||
var newObject = (Node)newObjectScene.Instance();
|
||||
GetNode(currentLine["Parent"].ToString()).AddChild(newObject);
|
||||
newObject.Set("Position", new Vector2((float)currentLine["PosX"], (float)currentLine["PosY"]));
|
||||
GetNode(nodeData["Parent"].ToString()).AddChild(newObject);
|
||||
newObject.Set("Position", new Vector2((float)nodeData["PosX"], (float)nodeData["PosY"]));
|
||||
|
||||
// Now we set the remaining variables.
|
||||
foreach (KeyValuePair<object, object> entry in currentLine)
|
||||
foreach (KeyValuePair<object, object> entry in nodeData)
|
||||
{
|
||||
string key = entry.Key.ToString();
|
||||
if (key == "Filename" || key == "Parent" || key == "PosX" || key == "PosY")
|
||||
|
||||
Reference in New Issue
Block a user