godot-mota/src/level/LevelsManager.gd

93 lines
2.5 KiB
GDScript

extends Node2D
class_name LevelsManager
const tmp_level_scene_path = "user://tmp/"
const init_level_scene_path = "res://src/levels/"
const group_name = "serializable"
# 当前楼层
export var level : int = 1 setget set_level
# 全局数据
var global : Dictionary = {}
signal level_changed(level)
func _ready():
var dir = Directory.new()
FileUtils.remove_dir(tmp_level_scene_path)
dir.make_dir(tmp_level_scene_path)
# 获取当前楼层实例
func get_current_level_instance() -> LevelInstance:
return get_child(0) as LevelInstance
# 设置楼层
func set_level(next_level:int):
#保存数据
save_instance_to_local()
save_data_to_local()
#加载数据
var next_scene = load_scene_from_local(next_level)
add_child(next_scene)
get_current_level_instance().free()
load_data_from_local(next_level)
#设置数据
level = next_level
emit_signal("level_changed",next_level)
# 设置楼层和位置
func set_level_and_position(next_level:int,position:Vector2):
set_level(next_level)
var player = get_current_level_instance().get_player()
player.position = position
# 保存当前场景到本地文件
func save_instance_to_local():
var scene = PackedScene.new()
var result = scene.pack(get_current_level_instance())
if result == OK:
var error = ResourceSaver.save("%s%s.tscn" % [tmp_level_scene_path,level], scene)
if error != OK:
push_error("保存场景失败")
# 从本地加载场景文件
func load_scene_from_local(next_level:int) -> LevelInstance:
var path = "%s%s.tscn" % [tmp_level_scene_path,next_level]
var scene = null
if FileUtils.file_exist(path):
scene = load(path).instance()
else:
var init_path = "%sLevel%s.tscn" % [init_level_scene_path,next_level]
print("init_path ",init_path)
scene = load(init_path).instance()
scene.name = "Level%s" % next_level
return scene as LevelInstance
# 保存游戏数据
func save_data_to_local():
var data = {}
for node in get_tree().get_nodes_in_group(group_name):
node.save_data(data,global)
var file = File.new()
var file_error = file.open("%s%s.data" % [tmp_level_scene_path,level],File.WRITE)
if file_error != OK:
print("保存游戏数据失败:",file_error)
return
file.store_var(data,true)
file.close()
# 还原游戏数据
func load_data_from_local(next_level:int):
var file = File.new()
var file_error = file.open("%s%s.data" % [tmp_level_scene_path,next_level],File.READ)
var data = null
if file_error == OK:
data = file.get_var(true)
else:
data = {}
for node in get_tree().get_nodes_in_group(group_name):
node.load_data(data,global)