2026-05-29 19:54:56 +08:00

64 lines
2.7 KiB
GDScript

class_name UiMotion
extends RefCounted
static func apply_empty_button_style(button: Button) -> void:
if button == null:
return
var empty := StyleBoxEmpty.new()
for state in ["normal", "hover", "pressed", "disabled", "focus"]:
button.add_theme_stylebox_override(state, empty)
button.add_theme_color_override("font_color", Color.TRANSPARENT)
button.add_theme_color_override("font_hover_color", Color.TRANSPARENT)
button.add_theme_color_override("font_pressed_color", Color.TRANSPARENT)
static func play_click_pulse(owner: Node, target: Control) -> void:
if owner == null or target == null:
return
var tween := owner.create_tween()
tween.tween_property(target, "scale", Vector2(0.92, 0.92), 0.05).set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_OUT)
tween.tween_property(target, "scale", Vector2.ONE, 0.12).set_trans(Tween.TRANS_BACK).set_ease(Tween.EASE_OUT)
static func play_press_scale(owner: Node, target: Control) -> void:
if owner == null or target == null:
return
var tween := owner.create_tween()
tween.tween_property(target, "scale", Vector2(0.9, 0.9), 0.06).set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_OUT)
static func play_release_scale(owner: Node, target: Control) -> void:
if owner == null or target == null:
return
var tween := owner.create_tween()
tween.tween_property(target, "scale", Vector2.ONE, 0.12).set_trans(Tween.TRANS_BACK).set_ease(Tween.EASE_OUT)
static func play_patrol_loop(owner: Node, target: Control, start_position: Vector2, end_position: Vector2, options := {}) -> Tween:
if owner == null or target == null:
return null
var tween := owner.create_tween().bind_node(target).set_loops()
var start_delay := float(options.get("start_delay", 0.0))
if start_delay > 0.0:
tween.tween_interval(start_delay)
var before_forward: Callable = options.get("before_forward", Callable())
if before_forward.is_valid():
tween.tween_callback(before_forward)
tween.tween_property(target, "position", end_position, float(options.get("forward_duration", 5.0)))
var before_back: Callable = options.get("before_back", Callable())
if before_back.is_valid():
tween.tween_callback(before_back)
tween.tween_property(target, "position", start_position, float(options.get("back_duration", 5.0)))
var before_idle_tail: Callable = options.get("before_idle_tail", Callable())
if before_idle_tail.is_valid():
tween.tween_callback(before_idle_tail)
var idle_delay := float(options.get("idle_delay", 0.0))
if idle_delay > 0.0:
tween.tween_interval(idle_delay)
var before_idle: Callable = options.get("before_idle", Callable())
if before_idle.is_valid():
tween.tween_callback(before_idle)
target.set_meta(str(options.get("meta_name", "scene_tween")), tween)
return tween