场景结构:
    image.png
    最终效果:显示三个图标然后当鼠标单击视口时,其中一个图标改变位置,这时候创建外部文件,存储这三个节点的信息,然后关闭程序二次打开后,将会加载之前的改动的状态。
    image.png
    场景根节点代码:

    1. extends Node2D
    2. var fPath = "res://info.txt"
    3. var json = {}
    4. func loadInfo():
    5. #
    6. var f = File.new()
    7. # 文件是否存在
    8. if f.file_exists(fPath):
    9. # 清除原来的元素
    10. var icons = get_tree().get_nodes_in_group("icons")
    11. for icon in icons:
    12. icon.free()
    13. # 读入信息
    14. f.open(fPath,File.READ)
    15. while f.get_position() < f.get_len():
    16. var nodeIfo = f.get_line()
    17. var nodeDic = parse_json(nodeIfo)
    18. var newIcon = Sprite.new()
    19. newIcon.name = nodeDic.name
    20. newIcon.texture = load(nodeDic.texture)
    21. newIcon.position = Vector2(nodeDic.position.x,nodeDic.position.y)
    22. newIcon.scale = Vector2(nodeDic.scale.x,nodeDic.scale.y)
    23. var iconScript = load("res://icon.gd")
    24. newIcon.set_script(iconScript)
    25. newIcon.add_to_group("icons")
    26. self.add_child(newIcon)
    27. f.close()
    28. func saveInfo():
    29. var icons = get_tree().get_nodes_in_group("icons")
    30. var f = File.new()
    31. f.open(fPath,File.WRITE)
    32. for icon in icons:
    33. if icon.has_method("saveInfo"):
    34. var text = icon.saveInfo()
    35. f.store_line(to_json(text))
    36. f.close()
    37. func _ready():
    38. loadInfo()
    39. func _input(event):
    40. # 鼠标点击
    41. if event is InputEventMouseButton:
    42. if event.button_index == BUTTON_LEFT and event.pressed:
    43. print("mouse")
    44. $icon.position = event.position
    45. saveInfo()

    单个Sprite节点的代码:

    1. extends Sprite
    2. # 返回保存的数据
    3. func saveInfo():
    4. var dic = {
    5. "name":name,
    6. "position":{
    7. "x":self.position.x,
    8. "y":self.position.y
    9. },
    10. "scale":{
    11. "x":scale.x,
    12. "y":scale.y
    13. },
    14. "texture":texture.resource_path,
    15. }
    16. return dic

    在这个基础之上,可以存储节点更多的信息,比如父节点、脚本的路径、所属的分组等等。理论上可以完整保存一个场景某个时刻的状态,并完成复杂的嵌套关系的加载。