forked from datawhale/whale-town
创建新工程
This commit is contained in:
313
scripts/CharacterProfile.gd
Normal file
313
scripts/CharacterProfile.gd
Normal file
@@ -0,0 +1,313 @@
|
||||
extends Control
|
||||
class_name CharacterProfile
|
||||
## 角色档案界面
|
||||
## 显示角色的详细信息和个性化数据
|
||||
|
||||
# UI 元素
|
||||
var container: VBoxContainer
|
||||
var character_name_label: Label
|
||||
var level_exp_label: Label
|
||||
var status_mood_label: Label
|
||||
var traits_label: Label
|
||||
var bio_label: Label
|
||||
var attributes_container: VBoxContainer
|
||||
var skills_container: VBoxContainer
|
||||
var achievements_container: VBoxContainer
|
||||
var close_button: Button
|
||||
|
||||
# 角色数据
|
||||
var character_data: Dictionary = {}
|
||||
|
||||
# 信号
|
||||
signal profile_closed()
|
||||
|
||||
func _ready():
|
||||
"""初始化档案界面"""
|
||||
_create_ui()
|
||||
_setup_connections()
|
||||
|
||||
## 创建UI
|
||||
func _create_ui():
|
||||
"""创建档案界面的所有UI元素"""
|
||||
# 设置背景
|
||||
var panel = Panel.new()
|
||||
panel.anchor_right = 1.0
|
||||
panel.anchor_bottom = 1.0
|
||||
add_child(panel)
|
||||
|
||||
# 主容器
|
||||
container = VBoxContainer.new()
|
||||
container.anchor_left = 0.1
|
||||
container.anchor_right = 0.9
|
||||
container.anchor_top = 0.1
|
||||
container.anchor_bottom = 0.9
|
||||
add_child(container)
|
||||
|
||||
# 标题
|
||||
var title = Label.new()
|
||||
title.text = "角色档案"
|
||||
title.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
|
||||
title.add_theme_font_size_override("font_size", 24)
|
||||
container.add_child(title)
|
||||
|
||||
container.add_child(_create_spacer(10))
|
||||
|
||||
# 角色名称
|
||||
character_name_label = Label.new()
|
||||
character_name_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
|
||||
character_name_label.add_theme_font_size_override("font_size", 20)
|
||||
container.add_child(character_name_label)
|
||||
|
||||
# 等级和经验
|
||||
level_exp_label = Label.new()
|
||||
level_exp_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
|
||||
container.add_child(level_exp_label)
|
||||
|
||||
# 状态和心情
|
||||
status_mood_label = Label.new()
|
||||
status_mood_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
|
||||
container.add_child(status_mood_label)
|
||||
|
||||
container.add_child(_create_spacer(10))
|
||||
|
||||
# 个性特征
|
||||
var traits_title = Label.new()
|
||||
traits_title.text = "个性特征:"
|
||||
traits_title.add_theme_font_size_override("font_size", 16)
|
||||
container.add_child(traits_title)
|
||||
|
||||
traits_label = Label.new()
|
||||
traits_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART
|
||||
container.add_child(traits_label)
|
||||
|
||||
container.add_child(_create_spacer(5))
|
||||
|
||||
# 个人简介
|
||||
var bio_title = Label.new()
|
||||
bio_title.text = "个人简介:"
|
||||
bio_title.add_theme_font_size_override("font_size", 16)
|
||||
container.add_child(bio_title)
|
||||
|
||||
bio_label = Label.new()
|
||||
bio_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART
|
||||
container.add_child(bio_label)
|
||||
|
||||
container.add_child(_create_spacer(10))
|
||||
|
||||
# 属性
|
||||
var attributes_title = Label.new()
|
||||
attributes_title.text = "属性:"
|
||||
attributes_title.add_theme_font_size_override("font_size", 16)
|
||||
container.add_child(attributes_title)
|
||||
|
||||
attributes_container = VBoxContainer.new()
|
||||
container.add_child(attributes_container)
|
||||
|
||||
container.add_child(_create_spacer(5))
|
||||
|
||||
# 技能
|
||||
var skills_title = Label.new()
|
||||
skills_title.text = "技能:"
|
||||
skills_title.add_theme_font_size_override("font_size", 16)
|
||||
container.add_child(skills_title)
|
||||
|
||||
skills_container = VBoxContainer.new()
|
||||
container.add_child(skills_container)
|
||||
|
||||
container.add_child(_create_spacer(5))
|
||||
|
||||
# 成就
|
||||
var achievements_title = Label.new()
|
||||
achievements_title.text = "成就:"
|
||||
achievements_title.add_theme_font_size_override("font_size", 16)
|
||||
container.add_child(achievements_title)
|
||||
|
||||
achievements_container = VBoxContainer.new()
|
||||
container.add_child(achievements_container)
|
||||
|
||||
container.add_child(_create_spacer(10))
|
||||
|
||||
# 关闭按钮
|
||||
close_button = Button.new()
|
||||
close_button.text = "关闭"
|
||||
close_button.custom_minimum_size = Vector2(100, 40)
|
||||
var button_center = CenterContainer.new()
|
||||
button_center.add_child(close_button)
|
||||
container.add_child(button_center)
|
||||
|
||||
## 创建间距
|
||||
func _create_spacer(height: float) -> Control:
|
||||
"""创建垂直间距"""
|
||||
var spacer = Control.new()
|
||||
spacer.custom_minimum_size = Vector2(0, height)
|
||||
return spacer
|
||||
|
||||
## 设置连接
|
||||
func _setup_connections():
|
||||
"""设置信号连接"""
|
||||
close_button.pressed.connect(_on_close_pressed)
|
||||
|
||||
## 加载角色数据
|
||||
func load_character_data(data: Dictionary):
|
||||
"""
|
||||
加载并显示角色数据
|
||||
@param data: 角色数据字典
|
||||
"""
|
||||
character_data = data
|
||||
_update_display()
|
||||
|
||||
## 更新显示
|
||||
func _update_display():
|
||||
"""更新所有显示内容"""
|
||||
if character_data.is_empty():
|
||||
return
|
||||
|
||||
# 角色名称
|
||||
var name = character_data.get(CharacterData.FIELD_NAME, "Unknown")
|
||||
character_name_label.text = name
|
||||
|
||||
# 等级和经验
|
||||
var level = character_data.get(CharacterData.FIELD_LEVEL, 1)
|
||||
var exp = character_data.get(CharacterData.FIELD_EXPERIENCE, 0)
|
||||
var required_exp = CharacterData.get_required_experience(level)
|
||||
level_exp_label.text = "等级 %d (%d/%d 经验)" % [level, exp, required_exp]
|
||||
|
||||
# 状态和心情
|
||||
var status = character_data.get(CharacterData.FIELD_STATUS, "active")
|
||||
var mood = character_data.get(CharacterData.FIELD_MOOD, "neutral")
|
||||
var personalization = preload("res://scripts/CharacterPersonalization.gd")
|
||||
var mood_emoji = personalization.get_mood_emoji(mood)
|
||||
status_mood_label.text = "状态: %s | 心情: %s %s" % [status, mood, mood_emoji]
|
||||
|
||||
# 个性特征
|
||||
var personality = character_data.get(CharacterData.FIELD_PERSONALITY, {})
|
||||
var traits = personality.get("traits", [])
|
||||
var activity = personality.get("favorite_activity", "exploring")
|
||||
|
||||
if traits.size() > 0:
|
||||
traits_label.text = "、".join(traits) + " | 喜欢: " + activity
|
||||
else:
|
||||
traits_label.text = "喜欢: " + activity
|
||||
|
||||
# 个人简介
|
||||
var bio = personality.get("bio", "")
|
||||
if bio.is_empty():
|
||||
bio_label.text = "这个角色还没有写个人简介。"
|
||||
else:
|
||||
bio_label.text = bio
|
||||
|
||||
# 属性
|
||||
_update_attributes()
|
||||
|
||||
# 技能
|
||||
_update_skills()
|
||||
|
||||
# 成就
|
||||
_update_achievements()
|
||||
|
||||
## 更新属性显示
|
||||
func _update_attributes():
|
||||
"""更新属性显示"""
|
||||
# 清除现有内容
|
||||
for child in attributes_container.get_children():
|
||||
child.queue_free()
|
||||
|
||||
var attributes = character_data.get(CharacterData.FIELD_ATTRIBUTES, {})
|
||||
|
||||
for attr_name in attributes:
|
||||
var value = attributes[attr_name]
|
||||
var attr_container = HBoxContainer.new()
|
||||
|
||||
var name_label = Label.new()
|
||||
name_label.text = attr_name + ":"
|
||||
name_label.custom_minimum_size = Vector2(100, 0)
|
||||
attr_container.add_child(name_label)
|
||||
|
||||
var progress_bar = ProgressBar.new()
|
||||
progress_bar.min_value = 1
|
||||
progress_bar.max_value = 10
|
||||
progress_bar.value = value
|
||||
progress_bar.custom_minimum_size = Vector2(200, 20)
|
||||
attr_container.add_child(progress_bar)
|
||||
|
||||
var value_label = Label.new()
|
||||
value_label.text = str(value) + "/10"
|
||||
attr_container.add_child(value_label)
|
||||
|
||||
attributes_container.add_child(attr_container)
|
||||
|
||||
## 更新技能显示
|
||||
func _update_skills():
|
||||
"""更新技能显示"""
|
||||
# 清除现有内容
|
||||
for child in skills_container.get_children():
|
||||
child.queue_free()
|
||||
|
||||
var skills = character_data.get(CharacterData.FIELD_SKILLS, {})
|
||||
|
||||
for skill_name in skills:
|
||||
var level = skills[skill_name]
|
||||
var skill_container = HBoxContainer.new()
|
||||
|
||||
var name_label = Label.new()
|
||||
name_label.text = skill_name + ":"
|
||||
name_label.custom_minimum_size = Vector2(100, 0)
|
||||
skill_container.add_child(name_label)
|
||||
|
||||
var progress_bar = ProgressBar.new()
|
||||
progress_bar.min_value = 1
|
||||
progress_bar.max_value = 10
|
||||
progress_bar.value = level
|
||||
progress_bar.custom_minimum_size = Vector2(200, 20)
|
||||
skill_container.add_child(progress_bar)
|
||||
|
||||
var level_label = Label.new()
|
||||
level_label.text = "等级 " + str(level)
|
||||
skill_container.add_child(level_label)
|
||||
|
||||
skills_container.add_child(skill_container)
|
||||
|
||||
## 更新成就显示
|
||||
func _update_achievements():
|
||||
"""更新成就显示"""
|
||||
# 清除现有内容
|
||||
for child in achievements_container.get_children():
|
||||
child.queue_free()
|
||||
|
||||
var achievements = character_data.get(CharacterData.FIELD_ACHIEVEMENTS, [])
|
||||
|
||||
if achievements.is_empty():
|
||||
var no_achievements = Label.new()
|
||||
no_achievements.text = "还没有获得任何成就。"
|
||||
achievements_container.add_child(no_achievements)
|
||||
return
|
||||
|
||||
for achievement in achievements:
|
||||
var achievement_container = HBoxContainer.new()
|
||||
|
||||
var icon_label = Label.new()
|
||||
icon_label.text = achievement.get("icon", "🏆")
|
||||
icon_label.add_theme_font_size_override("font_size", 20)
|
||||
achievement_container.add_child(icon_label)
|
||||
|
||||
var info_container = VBoxContainer.new()
|
||||
|
||||
var name_label = Label.new()
|
||||
name_label.text = achievement.get("name", "Unknown Achievement")
|
||||
name_label.add_theme_font_size_override("font_size", 14)
|
||||
info_container.add_child(name_label)
|
||||
|
||||
var desc_label = Label.new()
|
||||
desc_label.text = achievement.get("description", "")
|
||||
desc_label.add_theme_font_size_override("font_size", 12)
|
||||
desc_label.add_theme_color_override("font_color", Color.GRAY)
|
||||
info_container.add_child(desc_label)
|
||||
|
||||
achievement_container.add_child(info_container)
|
||||
achievements_container.add_child(achievement_container)
|
||||
|
||||
## 关闭按钮回调
|
||||
func _on_close_pressed():
|
||||
"""关闭档案界面"""
|
||||
profile_closed.emit()
|
||||
queue_free()
|
||||
Reference in New Issue
Block a user