D5/Entity/Level/start.gd
2025-05-09 15:36:04 +08:00

179 lines
8.9 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 文件名: start.gd
# 场景的根节点脚本,通常用于处理主菜单或启动界面的逻辑。
extends Node2D
# --- 节点引用 ---
# !! 重要:请根据你的实际场景结构调整以下节点路径 !!
@onready var new_game_button = $UI/Select_List/New
@onready var load_game_button = $UI/Select_List/Load
# @onready var error_message_label = $UI/ErrorMessageLabel # 如果有错误提示标签
# --- 场景路径 ---
var GameScene_path = "res://Entity/Level/GameScene.tscn"
# --- Godot 生命周期方法 ---
func _ready():
print("Start Scene: Initializing...")
# --- 连接 UI 信号 ---
if new_game_button:
new_game_button.pressed.connect(_on_new_game_pressed)
print("Start Scene: Connected 'pressed' signal for New Game button.")
else:
printerr("Start Scene Error: New Game button node not found at path specified in @onready var.")
if load_game_button:
load_game_button.pressed.connect(_on_load_game_pressed)
print("Start Scene: Connected 'pressed' signal for Load Game button.")
# 示例:根据存档是否存在禁用加载按钮 (需要 SaveLoadManager Autoload)
# if ProjectSettings.has_setting("autoload/SaveLoadManager"):
# load_game_button.disabled = !SaveLoadManager.does_save_exist(1) # 假设检查槽位1
# else:
# printerr("Start Scene Warning: SaveLoadManager Autoload not found, cannot check save existence for button state.")
else:
printerr("Start Scene Error: Load Game button node not found at path specified in @onready var.")
# --- 连接 InitializationManager 信号 ---
# 确保 InitializationManager 是 Autoload 并且已经注册
if ProjectSettings.has_setting("autoload/InitializationManager"):
# 连接新游戏初始化完成信号
if not InitializationManager.is_connected("new_game_initialized", Callable(self, "_on_initialization_complete")):
InitializationManager.new_game_initialized.connect(_on_initialization_complete)
print("Start Scene: Connected to InitializationManager.new_game_initialized signal.")
# 连接加载游戏完成信号
if not InitializationManager.is_connected("game_loaded", Callable(self, "_on_initialization_complete")):
InitializationManager.game_loaded.connect(_on_initialization_complete)
print("Start Scene: Connected to InitializationManager.game_loaded signal.")
else:
# 如果没有配置 Autoload这是一个严重错误
printerr("Start Scene Error: InitializationManager Autoload is not configured in Project Settings!")
# 在这种情况下,游戏可能无法正常启动新游戏或加载
if new_game_button: new_game_button.disabled = true
if load_game_button: load_game_button.disabled = true
# 当此节点从场景树中移除时调用
func _exit_tree():
# 断开与 Autoload 信号的连接,这是一个良好的实践
if ProjectSettings.has_setting("autoload/InitializationManager"):
# 断开新游戏信号
if InitializationManager.is_connected("new_game_initialized", Callable(self, "_on_initialization_complete")):
InitializationManager.new_game_initialized.disconnect(Callable(self, "_on_initialization_complete"))
print("Start Scene: Disconnected from InitializationManager.new_game_initialized signal.")
# 断开加载游戏信号
if InitializationManager.is_connected("game_loaded", Callable(self, "_on_initialization_complete")):
InitializationManager.game_loaded.disconnect(Callable(self, "_on_initialization_complete"))
print("Start Scene: Disconnected from InitializationManager.game_loaded signal.")
# --- UI 信号回调函数 ---
# 当“新游戏”按钮被按下时调用
func _on_new_game_pressed():
print("Start Scene: 'New Game' button pressed. Requesting new game initialization...")
if new_game_button: new_game_button.disabled = true
if load_game_button: load_game_button.disabled = true
if ProjectSettings.has_setting("autoload/InitializationManager"):
# 调用 InitializationManager 启动流程
# start_new_game_process 返回 true/false 表示调用是否成功启动(例如数据加载失败)
if not InitializationManager.start_new_game_process():
# 如果启动流程本身就失败了(例如 InitialDataManager 无法加载数据)
printerr("Start Scene: InitializationManager.start_new_game_process() failed immediately.")
# 显示错误信息给用户
# if error_message_label: error_message_label.text = "无法启动新游戏,请检查配置。"
# 重新启用按钮
if new_game_button: new_game_button.disabled = false
if load_game_button: load_game_button.disabled = false
# else: # 如果启动成功,则等待 _on_initialization_complete 信号
# print("Start Scene: New game process started, waiting for completion signal...")
else:
printerr("Start Scene Error: Cannot start new game - InitializationManager Autoload not found!")
if new_game_button: new_game_button.disabled = false
if load_game_button: load_game_button.disabled = false
# 当“加载游戏”按钮被按下时调用
func _on_load_game_pressed():
var slot_to_load = 1 # <-- 硬编码加载的存档槽位 ID
print("Start Scene: 'Load Game' button pressed. Requesting load for slot " + str(slot_to_load) + "...")
if new_game_button: new_game_button.disabled = true
if load_game_button: load_game_button.disabled = true
# --- 需要 SaveLoadManager 来获取存档数据 ---
if not ProjectSettings.has_setting("autoload/SaveLoadManager"):
printerr("Start Scene Error: Cannot load game - SaveLoadManager Autoload not found!")
if new_game_button: new_game_button.disabled = false
if load_game_button: load_game_button.disabled = false
return # 无法继续
# 1. 尝试从 SaveLoadManager 加载数据 (现在期望返回字典或 null)
var loaded_data: Variant = SaveLoadManager.load_game(slot_to_load)
# 2. 检查加载是否成功 (返回 null 表示失败)
if loaded_data == null:
printerr("Start Scene: Failed to load save data from slot " + str(slot_to_load) + " (SaveLoadManager returned null).")
# 显示错误信息给用户
# if error_message_label: error_message_label.text = "加载存档失败!"
# 重新启用按钮
if new_game_button: new_game_button.disabled = false
if load_game_button: load_game_button.disabled = false
return # 加载失败,中止
# 2.1 (可选但推荐) 再次确认加载的数据是字典类型
if not loaded_data is Dictionary:
printerr("Start Scene Error: Loaded data from SaveLoadManager is not a Dictionary. Type:", typeof(loaded_data))
if new_game_button: new_game_button.disabled = false
if load_game_button: load_game_button.disabled = false
return # 数据类型错误,中止
# 3. 如果存档数据加载成功 (是字典),再调用 InitializationManager 处理
if ProjectSettings.has_setting("autoload/InitializationManager"):
# 将加载到的字典传递给 load_game_process
if not InitializationManager.load_game_process(loaded_data): # <--- 传递字典
printerr("Start Scene: InitializationManager.load_game_process() failed.")
# 显示错误信息给用户
# if error_message_label: error_message_label.text = "应用存档状态时出错。"
# 重新启用按钮
if new_game_button: new_game_button.disabled = false
if load_game_button: load_game_button.disabled = false
# else: # 如果启动成功,则等待 _on_initialization_complete 信号
# print("Start Scene: Load game process started, waiting for completion signal...")
else:
printerr("Start Scene Error: Cannot process loaded game - InitializationManager Autoload not found!")
if new_game_button: new_game_button.disabled = false
if load_game_button: load_game_button.disabled = false
# --- InitializationManager 信号回调函数 ---
# 当 InitializationManager 完成新游戏或加载游戏流程后,此函数被调用
func _on_initialization_complete(): # 移除了 success 参数
print("Start Scene: Received initialization complete signal (New Game or Load).")
# 既然信号被发出,我们认为初始化流程是成功的
print("--------------------------------------------------")
print("Start Scene: Initialization successful!")
print("--------------------------------------------------")
# 切换到主游戏场景
Go_To_GameScene() # 保持不变
# 注意:这里没有处理初始化失败的情况,因为失败应该在
# start_new_game_process 或 load_game_process 返回 false 时,
# 或者在 SaveLoadManager.load_game 失败时,在调用处直接处理。
# 如果 InitializationManager 内部在发出信号前还可能失败,
# 则需要重新考虑信号设计或错误处理流程。
# --- 辅助函数 ---
# 切换到主游戏场景 (保持不变)
func Go_To_GameScene():
print("Start Scene: Attempting to switch to Game Scene:", GameScene_path)
var err = get_tree().change_scene_to_file(GameScene_path)
if err != OK:
printerr("Start Scene CRITICAL ERROR: Failed to switch to main game scene!")
printerr(" Path: " + GameScene_path)
printerr(" Error code: " + str(err))
# if error_message_label: error_message_label.text = "无法加载主游戏场景!"