You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

85 lines
2.7 KiB
GDScript

2 years ago
extends Node3D
class_name LevelManager
var level: Node3D
var level_path : String
var load_time : float
var load_control_time : float
2 years ago
func _ready():
Global.level_mgr = self
2 years ago
2 years ago
func init():
MetSys.set_save_data()
goto_level(MetSys.get_full_room_path(Setting.starting_level))
MetSys.room_changed.connect(on_room_changed)
2 years ago
2 years ago
func _process(delta) -> void:
if Global.is_level_loading:
if load_time > 0:
load_time -= delta
return
var status: int = ResourceLoader.load_threaded_get_status(level_path)
match status:
ResourceLoader.THREAD_LOAD_IN_PROGRESS:
return
ResourceLoader.THREAD_LOAD_LOADED:
pass
_:
print("关卡加载错误")
return
goto_level_end()
Global.is_level_loading_contorl = true
load_control_time = Setting.level_loading_control_time
elif Global.is_level_loading_contorl:
if load_control_time > 0:
load_control_time -= delta
return
Global.is_level_loading_contorl = false
return
func on_room_changed(target_level: String):
goto_level(MetSys.get_full_room_path(target_level))
2 years ago
func goto_level(new_level_path: String) -> void:
if Global.is_level_loading:
print("连续进入关卡:",new_level_path)
return
print("goto_level:",new_level_path)
level_path = new_level_path
ResourceLoader.load_threaded_request(level_path)
Global.is_level_loading = true
if level:
load_time = Setting.level_loading_min_time
SignalManager.level_loading_start.emit()
else:
load_time = 0
goto_level_end()
2 years ago
func goto_level_end():
var prev_level_position := Vector2i.MAX
if level:
prev_level_position = MetSys.get_current_room_instance().get_base_coords()
level.queue_free()
level = null
2 years ago
level = ResourceLoader.load_threaded_get(level_path).instantiate()
add_child(level)
MetSys.current_layer = MetSys.get_current_room_instance().get_layer()
var level_size = MetSys.get_current_room_instance().get_size()
SignalManager.level_size_change.emit(level_size)
2 years ago
if prev_level_position != Vector2i.MAX:
var player: Character = Global.character_mgr.get_player()
var pos_pre: Vector3 = player.pos()
var level_position_now = MetSys.get_current_room_instance().get_base_coords()
var pos_change_xz = Vector2(level_position_now - prev_level_position) * MetSys.settings.in_game_cell_size
pos_pre.x -= pos_change_xz.x
pos_pre.z -= pos_change_xz.y
player.set_pos(pos_pre)
2 years ago
Global.is_level_loading = false
Global.currlevel_name = level_path
SignalManager.level_loading_end.emit()