93 lines
2.8 KiB
GDScript
93 lines
2.8 KiB
GDScript
@tool
|
|
extends CharacterBody2D
|
|
class_name CatSlimeAvatar
|
|
|
|
@export var skin: SpriteFrames:
|
|
set(value):
|
|
skin = value
|
|
if visual:
|
|
visual.sprite_frames = skin
|
|
|
|
@export var avatar_name: String = "Twitch User":
|
|
set(value):
|
|
avatar_name = value
|
|
if display_name:
|
|
display_name.text = value
|
|
_resize_collision()
|
|
|
|
@onready var visual: AnimatedSprite2D = %Visual
|
|
@onready var display_name: Label = %DisplayName
|
|
@onready var state_machine: StateMachine = %StateMachine
|
|
@onready var overlap: Area2D = %Overlap
|
|
@onready var overlap_collision: CollisionShape2D = %OverlapCollision
|
|
|
|
var is_gravity_disabled: bool = false
|
|
var _overlapping: Array[Node] = []
|
|
var _hide_tween: Tween
|
|
var _show_tween: Tween
|
|
|
|
# Called when the node enters the scene tree for the first time.
|
|
func _ready() -> void:
|
|
visual.animation_changed.connect(_handle_animation_changed)
|
|
overlap.area_entered.connect(_handle_overlap_entered)
|
|
overlap.area_exited.connect(_handle_overlap_exited)
|
|
|
|
visual.sprite_frames = skin
|
|
display_name.text = avatar_name
|
|
_resize_collision()
|
|
|
|
func _handle_animation_changed() -> void:
|
|
if visual.animation == &"sleep":
|
|
visual.offset = Vector2(16,-16)
|
|
else:
|
|
visual.offset = Vector2.ZERO
|
|
|
|
func _handle_overlap_entered(node: Node) -> void:
|
|
_overlapping.append(node)
|
|
|
|
func _handle_overlap_exited(node: Node) -> void:
|
|
_overlapping.erase(node)
|
|
|
|
func _process(_delta: float) -> void:
|
|
if _overlapping.size() > 0: # Overlapping
|
|
if _hide_tween: return # Tween in progress
|
|
if display_name.modulate.a == 0.0: return # Display name is already hidden.
|
|
if _show_tween: # Show Tween is running, stop it, and clear it out.
|
|
_show_tween.kill()
|
|
_show_tween = null
|
|
_hide_tween = create_tween()
|
|
_hide_tween.tween_property(display_name, "modulate:a", 0.0, 0.5)
|
|
_hide_tween.tween_callback(func(): _hide_tween = null)
|
|
else: # Not Overlapping
|
|
if _show_tween: return # Tween in progress
|
|
if display_name.modulate.a == 1.0: return # Display name is shown.
|
|
if _hide_tween: # Hide Tween is running, stop it, and clear it out.
|
|
_hide_tween.kill()
|
|
_hide_tween = null
|
|
_show_tween = create_tween()
|
|
_show_tween.tween_property(display_name, "modulate:a", 1.0, 0.5)
|
|
_show_tween.tween_callback(func(): _show_tween = null)
|
|
pass
|
|
|
|
|
|
func _physics_process(delta: float) -> void:
|
|
if Engine.is_editor_hint():
|
|
return
|
|
if is_gravity_disabled:
|
|
velocity.y = 0
|
|
else:
|
|
velocity.y += get_gravity().y * delta
|
|
move_and_slide()
|
|
|
|
if state_machine.current_state.name.to_lower() != "born":
|
|
if velocity.length() > 0 and visual.animation != &"walk":
|
|
visual.play(&"walk")
|
|
elif velocity.length() == 0 and visual.animation != &"idle":
|
|
visual.play(&"idle")
|
|
|
|
visual.flip_h = velocity.x < 0
|
|
|
|
func _resize_collision() -> void:
|
|
await get_tree().process_frame
|
|
var lsize = display_name.size
|
|
overlap_collision.shape.size.x = lsize.x
|