本文最后更新于186 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com

初始化阶段 (行18-34):
- 信号连接 (行20-30):
- 连接技能列表的选择和激活信号
- 连接使用按钮和取消按钮的点击信号
- 使用条件判断确保信号只连接一次,避免重复连接
func _ready() -> void:
# 连接信号
if !skill_list.item_selected.is_connected(_on_skill_item_selected):
skill_list.item_selected.connect(_on_skill_item_selected)
if !skill_list.item_activated.is_connected(_on_skill_item_activated):
skill_list.item_activated.connect(_on_skill_item_activated)
if !use_button.pressed.is_connected(_on_use_button_pressed):
use_button.pressed.connect(_on_use_button_pressed)
if !cancel_button.pressed.is_connected(_on_cancel_button_pressed):
cancel_button.pressed.connect(_on_cancel_button_pressed)
# 初始隐藏并禁用使用按钮
hide()
use_button.disabled = true
- 初始状态设置 (行32-34):
- 默认隐藏面板: hide()
- 禁用使用按钮: use_button.disabled = true
- 确保面板在未使用时不显示,且使用按钮初始状态为不可用
菜单显示流程 (行36-57):
- 1. 数据初始化 (行38-42):
- 存储角色技能数据: self.current_character_skills = character_skills
- 清空技能列表: skill_list.clear()
- 重置描述文本: skill_description.text = “选择一个技能查看描述…”
- 重置选择索引: selected_skill_index = -1
- 禁用使用按钮: use_button.disabled = true
- 2. 技能列表构建 (行44-53):
- 遍历角色技能数组: for i in range(character_skills.size())
- 获取技能数据: var skill: SkillData = character_skills[i]
- 构建显示文本: skill.skill_name + ” (MP: ” + str(skill.mp_cost) + “)”
- 添加到技能列表: skill_list.add_item(item_text)
- MP检查与状态设置:
- 判断MP是否足够: if caster_mp < skill.mp_cost
- 禁用不足MP的技能: skill_list.set_item_disabled(i, true)
- 设置灰色文本: skill_list.set_item_custom_fg_color(i, Color(0.5, 0.5, 0.5))
- 显示面板: show()
- 获取焦点: skill_list.grab_focus() ,支持键盘操作
func show_menu(character_skills: Array[SkillData], caster_mp: int) -> void:
self.current_character_skills = character_skills
skill_list.clear()
skill_description.text = "选择一个技能查看描述..."
selected_skill_index = -1
use_button.disabled = true
for i in range(character_skills.size()):
var skill: SkillData = character_skills[i]
if skill:
var item_text = skill.skill_name + " (MP: " + str(skill.mp_cost) + ")"
skill_list.add_item(item_text)
# 根据MP是否足够,设置项目是否可用
if caster_mp < skill.mp_cost:
skill_list.set_item_disabled(i, true)
skill_list.set_item_custom_fg_color(i, Color(0.5, 0.5, 0.5)) # 灰色表示不可用
show()
# 获取焦点以便键盘操作
skill_list.grab_focus()
2. 技能选择阶段
交互方式 :鼠标点击技能项 / 键盘方向键选择
内部逻辑 ( _on_skill_item_selected 函数,行60-66):
- 验证选择 :检查索引是否有效
- 状态更新 :
- 记录当前选择的技能索引
- 显示技能详细描述
- 根据技能可用性更新使用按钮状态(可用/禁用)
3. 技能使用阶段
触发方式 :
- 点击”使用”按钮
- 双击可用的技能项
内部逻辑 :
- 按钮点击 ( _on_use_button_pressed 函数,行75-80):
- 验证选择的技能是否有效且可用
- 发出 skill_selected 信号,传递选中的技能数据
- 隐藏面板
- 双击技能 ( _on_skill_item_activated 函数,行69-72):
- 调用选择处理函数更新状态
- 检查技能是否可用
- 如果可用,自动调用使用按钮的处理逻辑
4. 取消操作阶段
触发条件 :点击”取消”按钮
内部逻辑 ( _on_cancel_button_pressed 函数,行83-85):
隐藏面板
发出 skill_selection_cancelled 信号
## 当选择了技能项
func _on_skill_item_selected(index: int) -> void:
if index >= 0 and index < current_character_skills.size():
selected_skill_index = index
var skill: SkillData = current_character_skills[index]
if skill:
skill_description.text = skill.description
use_button.disabled = skill_list.is_item_disabled(index)
## 当双击了技能项
func _on_skill_item_activated(index: int) -> void:
_on_skill_item_selected(index)
if !use_button.disabled:
_on_use_button_pressed()
## 当点击使用按钮
func _on_use_button_pressed() -> void:
if selected_skill_index >= 0 and selected_skill_index < current_character_skills.size():
var skill: SkillData = current_character_skills[selected_skill_index]
if skill and !skill_list.is_item_disabled(selected_skill_index):
skill_selected.emit(skill)
hide()
## 当点击取消按钮
func _on_cancel_button_pressed() -> void:
skill_selection_cancelled.emit()
hide()
