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.
		
		
		
		
		
			
		
			
				
	
	
		
			80 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			GDScript
		
	
			
		
		
	
	
			80 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			GDScript
		
	
| extends Node3D
 | |
| 
 | |
| class_name LevelManager
 | |
| 
 | |
| var level: Node3D
 | |
| var level_path : String
 | |
| var load_time : float
 | |
| var load_control_time : float
 | |
| 
 | |
| func _ready():
 | |
| 	Global.level_mgr = self
 | |
| 	
 | |
| func init():
 | |
| 	MetSys.set_save_data()
 | |
| 	goto_level(MetSys.get_full_room_path(Setting.starting_level))
 | |
| 	MetSys.room_changed.connect(on_room_changed)
 | |
| 
 | |
| func _process(delta):
 | |
| 	if Global.is_level_loading:
 | |
| 		if load_time > 0:
 | |
| 			load_time -= delta
 | |
| 			return
 | |
| 		var status = ResourceLoader.load_threaded_get_status(level_path)
 | |
| 		match status:
 | |
| 			ResourceLoader.ThreadLoadStatus.THREAD_LOAD_IN_PROGRESS:return
 | |
| 			ResourceLoader.ThreadLoadStatus.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
 | |
| 
 | |
| func on_room_changed(target_level: String):
 | |
| 	goto_level(MetSys.get_full_room_path(target_level))
 | |
| 	
 | |
| func goto_level(new_level_path: String):
 | |
| 	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()
 | |
| 		
 | |
| 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
 | |
| 		
 | |
| 	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)
 | |
| 	
 | |
| 	if prev_level_position != Vector2i.MAX:
 | |
| 		var player = Global.character_mgr.get_player()
 | |
| 		var pos_pre = 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)
 | |
| 	
 | |
| 	Global.is_level_loading = false
 | |
| 	Global.currlevel_name = level_path
 | |
| 	SignalManager.level_loading_end.emit()
 |