From 3b099aed407cdbae9dd5c2b7fe52dd19ec0004cb Mon Sep 17 00:00:00 2001 From: ShadesAndGrays Date: Fri, 22 May 2026 18:20:37 +0100 Subject: [PATCH] add ui component --- UIComponents/animated_button_component.gd | 61 +++++++++++++++++++ UIComponents/animated_button_component.gd.uid | 1 + UIComponents/animated_visibility_component.gd | 22 +++++++ .../animated_visibility_component.gd.uid | 1 + 4 files changed, 85 insertions(+) create mode 100644 UIComponents/animated_button_component.gd create mode 100644 UIComponents/animated_button_component.gd.uid create mode 100644 UIComponents/animated_visibility_component.gd create mode 100644 UIComponents/animated_visibility_component.gd.uid diff --git a/UIComponents/animated_button_component.gd b/UIComponents/animated_button_component.gd new file mode 100644 index 0000000..360475e --- /dev/null +++ b/UIComponents/animated_button_component.gd @@ -0,0 +1,61 @@ + +class_name AnimatedButtonComponent extends Area2D + +@export var object:Node2D + +var scale_tween:Tween +var rotate_tween:Tween +var offset_tween:Tween +@export var scale_tween_duration:float +@export var rotate_tween_duration:float +@export var offset_tween_duration:float +@export var anim_scale:Vector2 = Vector2.ONE +@export var anim_rotate = 1.0 +@export var anim_offset:Vector2 = Vector2.ZERO + +var original_position:Vector2 + + +var can_click = false + +signal clicked + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + mouse_entered.connect(_on_hover.bind(true)) + mouse_exited.connect(_on_hover.bind(false)) + original_position = global_position + +func _process(delta: float) -> void: + if Input.is_action_just_pressed("click") and can_click: + clicked.emit() + +func _on_hover(hover:bool) -> void: + can_click = hover + if hover: + if scale_tween: + scale_tween.kill() + if rotate_tween: + rotate_tween.kill() + if offset_tween: + offset_tween.kill() + scale_tween = create_tween() + rotate_tween = create_tween() + offset_tween = create_tween() + scale_tween.tween_property(object,"scale",anim_scale,scale_tween_duration) + rotate_tween.tween_property(object,"rotation",anim_rotate,rotate_tween_duration) + offset_tween.tween_property(object,"global_position",original_position + anim_offset , offset_tween_duration) + pass + else: + if scale_tween: + scale_tween.kill() + if rotate_tween: + rotate_tween.kill() + if offset_tween: + offset_tween.kill() + scale_tween = create_tween() + rotate_tween = create_tween() + offset_tween = create_tween() + scale_tween.tween_property(object,"scale",Vector2(1,1),scale_tween_duration) + rotate_tween.tween_property(object,"rotation",0,rotate_tween_duration) + offset_tween.tween_property(object,"global_position",original_position, offset_tween_duration) diff --git a/UIComponents/animated_button_component.gd.uid b/UIComponents/animated_button_component.gd.uid new file mode 100644 index 0000000..981b414 --- /dev/null +++ b/UIComponents/animated_button_component.gd.uid @@ -0,0 +1 @@ +uid://dnq0l8dy4b1g3 diff --git a/UIComponents/animated_visibility_component.gd b/UIComponents/animated_visibility_component.gd new file mode 100644 index 0000000..3b88142 --- /dev/null +++ b/UIComponents/animated_visibility_component.gd @@ -0,0 +1,22 @@ +class_name AnimatedVisibiltyComponent extends Area2D + + +var visibility_tween:Tween +@export var visibility_tween_duration:float + + +func _ready() -> void: + mouse_entered.connect(_on_hover.bind(true)) + mouse_exited.connect(_on_hover.bind(false)) + modulate.a = 0 + + +func _on_hover(hover): + if visibility_tween: + visibility_tween.kill() + visibility_tween = create_tween() + + if hover: + visibility_tween.tween_property(self,"modulate:a",255,visibility_tween_duration) + else: + visibility_tween.tween_property(self,"modulate:a",0,visibility_tween_duration) diff --git a/UIComponents/animated_visibility_component.gd.uid b/UIComponents/animated_visibility_component.gd.uid new file mode 100644 index 0000000..fda85e2 --- /dev/null +++ b/UIComponents/animated_visibility_component.gd.uid @@ -0,0 +1 @@ +uid://kareqnhvqqvp