创建新工程
This commit is contained in:
88
scripts/VirtualButton.gd
Normal file
88
scripts/VirtualButton.gd
Normal file
@@ -0,0 +1,88 @@
|
||||
extends Control
|
||||
class_name VirtualButton
|
||||
## 虚拟按钮控件
|
||||
## 用于移动端触摸输入
|
||||
|
||||
# 按钮参数
|
||||
@export var button_radius: float = 40.0
|
||||
@export var button_text: String = "E"
|
||||
|
||||
# 按钮状态
|
||||
var is_pressed_state: bool = false
|
||||
var was_just_pressed: bool = false
|
||||
var touch_index: int = -1
|
||||
|
||||
# 视觉元素
|
||||
var button_circle: ColorRect
|
||||
var label: Label
|
||||
|
||||
func _ready():
|
||||
"""初始化虚拟按钮"""
|
||||
_create_visual_elements()
|
||||
|
||||
# 设置大小
|
||||
custom_minimum_size = Vector2(button_radius * 2, button_radius * 2)
|
||||
size = custom_minimum_size
|
||||
|
||||
func _create_visual_elements():
|
||||
"""创建按钮的视觉元素"""
|
||||
# 创建按钮背景
|
||||
button_circle = ColorRect.new()
|
||||
button_circle.color = Color(0.2, 0.6, 0.2, 0.6)
|
||||
button_circle.size = Vector2(button_radius * 2, button_radius * 2)
|
||||
button_circle.position = Vector2.ZERO
|
||||
add_child(button_circle)
|
||||
|
||||
# 创建文本标签
|
||||
label = Label.new()
|
||||
label.text = button_text
|
||||
label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
|
||||
label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER
|
||||
label.size = Vector2(button_radius * 2, button_radius * 2)
|
||||
label.position = Vector2.ZERO
|
||||
label.add_theme_font_size_override("font_size", 24)
|
||||
add_child(label)
|
||||
|
||||
func _process(_delta: float):
|
||||
"""每帧更新"""
|
||||
# 重置 just_pressed 状态
|
||||
if was_just_pressed:
|
||||
was_just_pressed = false
|
||||
|
||||
func _gui_input(event: InputEvent):
|
||||
"""处理触摸输入"""
|
||||
if event is InputEventScreenTouch:
|
||||
if event.pressed:
|
||||
# 触摸开始
|
||||
is_pressed_state = true
|
||||
was_just_pressed = true
|
||||
touch_index = event.index
|
||||
_update_visual(true)
|
||||
elif event.index == touch_index:
|
||||
# 触摸结束
|
||||
is_pressed_state = false
|
||||
touch_index = -1
|
||||
_update_visual(false)
|
||||
|
||||
func _update_visual(pressed: bool):
|
||||
"""更新按钮视觉状态"""
|
||||
if pressed:
|
||||
button_circle.color = Color(0.3, 0.8, 0.3, 0.8)
|
||||
else:
|
||||
button_circle.color = Color(0.2, 0.6, 0.2, 0.6)
|
||||
|
||||
## 检查按钮是否刚被按下
|
||||
func is_pressed() -> bool:
|
||||
"""
|
||||
检查按钮是否刚被按下(类似 Input.is_action_just_pressed)
|
||||
@return: 是否刚被按下
|
||||
"""
|
||||
return was_just_pressed
|
||||
|
||||
## 检查按钮是否正在被按住
|
||||
func is_held() -> bool:
|
||||
"""
|
||||
检查按钮是否正在被按住
|
||||
@return: 是否被按住
|
||||
"""
|
||||
return is_pressed_state
|
||||
Reference in New Issue
Block a user