场景结构:
最终效果:显示三个图标然后当鼠标单击视口时,其中一个图标改变位置,这时候创建外部文件,存储这三个节点的信息,然后关闭程序二次打开后,将会加载之前的改动的状态。
场景根节点代码:
extends Node2Dvar fPath = "res://info.txt"var json = {}func loadInfo():#var f = File.new()# 文件是否存在if f.file_exists(fPath):# 清除原来的元素var icons = get_tree().get_nodes_in_group("icons")for icon in icons:icon.free()# 读入信息f.open(fPath,File.READ)while f.get_position() < f.get_len():var nodeIfo = f.get_line()var nodeDic = parse_json(nodeIfo)var newIcon = Sprite.new()newIcon.name = nodeDic.namenewIcon.texture = load(nodeDic.texture)newIcon.position = Vector2(nodeDic.position.x,nodeDic.position.y)newIcon.scale = Vector2(nodeDic.scale.x,nodeDic.scale.y)var iconScript = load("res://icon.gd")newIcon.set_script(iconScript)newIcon.add_to_group("icons")self.add_child(newIcon)f.close()func saveInfo():var icons = get_tree().get_nodes_in_group("icons")var f = File.new()f.open(fPath,File.WRITE)for icon in icons:if icon.has_method("saveInfo"):var text = icon.saveInfo()f.store_line(to_json(text))f.close()func _ready():loadInfo()func _input(event):# 鼠标点击if event is InputEventMouseButton:if event.button_index == BUTTON_LEFT and event.pressed:print("mouse")$icon.position = event.positionsaveInfo()
单个Sprite节点的代码:
extends Sprite# 返回保存的数据func saveInfo():var dic = {"name":name,"position":{"x":self.position.x,"y":self.position.y},"scale":{"x":scale.x,"y":scale.y},"texture":texture.resource_path,}return dic
在这个基础之上,可以存储节点更多的信息,比如父节点、脚本的路径、所属的分组等等。理论上可以完整保存一个场景某个时刻的状态,并完成复杂的嵌套关系的加载。
