save_load_json.gd 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. extends Button
  2. # This script shows how to save data using the JSON file format.
  3. # JSON is a widely used file format, but not all Godot types can be
  4. # stored natively. For example, integers get converted into doubles,
  5. # and to store Vector2 and other non-JSON types you need `var2str()`.
  6. # The root game node (so we can get and instance enemies).
  7. export(NodePath) var game_node
  8. # The player node (so we can set/get its health and position).
  9. export(NodePath) var player_node
  10. const SAVE_PATH = "user://save_json.json"
  11. func save_game():
  12. var file = File.new()
  13. file.open(SAVE_PATH, File.WRITE)
  14. var player = get_node(player_node)
  15. # JSON doesn't support complex types such as Vector2.
  16. # `var2str()` can be used to convert any Variant to a String.
  17. var save_dict = {
  18. player = {
  19. position = var2str(player.position),
  20. health = var2str(player.health),
  21. },
  22. enemies = []
  23. }
  24. for enemy in get_tree().get_nodes_in_group("enemy"):
  25. save_dict.enemies.push_back({
  26. position = var2str(enemy.position),
  27. })
  28. file.store_line(to_json(save_dict))
  29. get_node("../LoadJSON").disabled = false
  30. # `load()` is reserved.
  31. func load_game():
  32. var file = File.new()
  33. file.open(SAVE_PATH, File.READ)
  34. var save_dict = parse_json(file.get_line())
  35. var player = get_node(player_node)
  36. # JSON doesn't support complex types such as Vector2.
  37. # `str2var()` can be used to convert a String to the corresponding Variant.
  38. player.position = str2var(save_dict.player.position)
  39. player.health = str2var(save_dict.player.health)
  40. # Remove existing enemies and add new ones.
  41. for enemy in get_tree().get_nodes_in_group("enemy"):
  42. enemy.queue_free()
  43. # Ensure the node structure is the same when loading.
  44. var game = get_node(game_node)
  45. for enemy_config in save_dict.enemies:
  46. var enemy = preload("res://enemy.tscn").instance()
  47. enemy.position = str2var(enemy_config.position)
  48. game.add_child(enemy)