创建新工程
This commit is contained in:
109
scripts/ChatBubble.gd
Normal file
109
scripts/ChatBubble.gd
Normal file
@@ -0,0 +1,109 @@
|
||||
extends Control
|
||||
class_name ChatBubble
|
||||
## 对话气泡
|
||||
## 在角色上方显示短暂的对话消息
|
||||
|
||||
# UI 元素
|
||||
var background: Panel
|
||||
var label: Label
|
||||
var timer: Timer
|
||||
|
||||
# 配置
|
||||
var bubble_padding: Vector2 = Vector2(10, 5)
|
||||
var max_width: float = 200.0
|
||||
var default_duration: float = 3.0
|
||||
|
||||
func _ready():
|
||||
"""初始化对话气泡"""
|
||||
_create_ui()
|
||||
|
||||
## 创建 UI 元素
|
||||
func _create_ui():
|
||||
"""创建气泡的所有 UI 元素"""
|
||||
# 设置为不阻挡输入
|
||||
mouse_filter = Control.MOUSE_FILTER_IGNORE
|
||||
|
||||
# 创建背景面板
|
||||
background = Panel.new()
|
||||
background.mouse_filter = Control.MOUSE_FILTER_IGNORE
|
||||
add_child(background)
|
||||
|
||||
# 创建文本标签
|
||||
label = Label.new()
|
||||
label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART
|
||||
label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
|
||||
label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER
|
||||
label.add_theme_font_size_override("font_size", 14)
|
||||
label.add_theme_color_override("font_color", Color(0, 0, 0))
|
||||
background.add_child(label)
|
||||
|
||||
# 创建计时器
|
||||
timer = Timer.new()
|
||||
timer.one_shot = true
|
||||
timer.timeout.connect(_on_timer_timeout)
|
||||
add_child(timer)
|
||||
|
||||
## 显示气泡
|
||||
func show_bubble(message: String, duration: float = 0.0) -> void:
|
||||
"""
|
||||
显示对话气泡
|
||||
@param message: 消息内容
|
||||
@param duration: 显示时长(秒),0 表示使用默认时长
|
||||
"""
|
||||
if duration <= 0:
|
||||
duration = default_duration
|
||||
|
||||
# 设置文本
|
||||
label.text = message
|
||||
|
||||
# 计算大小
|
||||
var text_size = label.get_combined_minimum_size()
|
||||
text_size.x = min(text_size.x, max_width)
|
||||
|
||||
# 设置标签大小
|
||||
label.custom_minimum_size = text_size
|
||||
label.size = text_size
|
||||
|
||||
# 设置背景大小
|
||||
var panel_size = text_size + bubble_padding * 2
|
||||
background.custom_minimum_size = panel_size
|
||||
background.size = panel_size
|
||||
|
||||
# 设置标签位置(居中)
|
||||
label.position = bubble_padding
|
||||
|
||||
# 设置整体大小
|
||||
custom_minimum_size = panel_size
|
||||
size = panel_size
|
||||
|
||||
# 显示气泡
|
||||
show()
|
||||
modulate = Color(1, 1, 1, 1)
|
||||
|
||||
# 启动计时器
|
||||
timer.start(duration)
|
||||
|
||||
# 淡入动画
|
||||
var tween = create_tween()
|
||||
tween.tween_property(self, "modulate:a", 1.0, 0.2)
|
||||
|
||||
## 隐藏气泡
|
||||
func hide_bubble() -> void:
|
||||
"""隐藏对话气泡(带淡出动画)"""
|
||||
var tween = create_tween()
|
||||
tween.tween_property(self, "modulate:a", 0.0, 0.3)
|
||||
tween.finished.connect(func(): hide())
|
||||
|
||||
## 计时器超时
|
||||
func _on_timer_timeout():
|
||||
"""计时器超时,隐藏气泡"""
|
||||
hide_bubble()
|
||||
|
||||
## 设置气泡位置(相对于角色)
|
||||
func set_bubble_position(character_position: Vector2, offset: Vector2 = Vector2(0, -40)):
|
||||
"""
|
||||
设置气泡位置
|
||||
@param character_position: 角色位置
|
||||
@param offset: 偏移量(默认在角色上方)
|
||||
"""
|
||||
global_position = character_position + offset - size / 2
|
||||
Reference in New Issue
Block a user