场景结构:
最终效果:显示三个图标然后当鼠标单击视口时,其中一个图标改变位置,这时候创建外部文件,存储这三个节点的信息,然后关闭程序二次打开后,将会加载之前的改动的状态。
场景根节点代码:
extends Node2D
var 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.name
newIcon.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.position
saveInfo()
单个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
在这个基础之上,可以存储节点更多的信息,比如父节点、脚本的路径、所属的分组等等。理论上可以完整保存一个场景某个时刻的状态,并完成复杂的嵌套关系的加载。