cirnogodot/Scripts/Tools/AnimatedTextureRect.gd
2025-03-14 10:16:40 +01:00

78 lines
2.2 KiB
GDScript

@tool
@icon("res://addons/AnimatedTextureRect/AnimatedTextureRect.png")
extends TextureRect
class_name AnimatedTextureRect
@export var Frames: SpriteFrames = null
var _previous_frames: SpriteFrames = null
var _current_animation: StringName = "default"
var autoplay: StringName = ""
var _current_frame: int
var _frame_timer: float = 0.0
var _animation_stopped: bool = false
# Signals
signal animation_finished
signal animation_changed
signal animation_looped
signal frame_changed
signal sprite_frames_changed
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
if !is_instance_valid(Frames): return
_frame_timer += delta
if Frames != _previous_frames:
sprite_frames_changed.emit()
_sprite_frames_changed()
var frame_FPS: float = 1.0 / Frames.get_animation_speed(_current_animation)
var frame_delay: float = frame_FPS * Frames.get_frame_duration(_current_animation, _current_frame)
if !_animation_stopped:
if _frame_timer > frame_delay:
_frame_timer -= frame_delay
_current_frame += 1
frame_changed.emit()
if _current_frame >= Frames.get_frame_count(_current_animation):
if Frames.get_animation_loop(_current_animation):
_current_frame = 0
animation_looped.emit()
else:
_current_frame -= 1
_animation_stopped = true
animation_finished.emit()
texture = Frames.get_frame_texture(_current_animation, _current_frame)
func play(animation: StringName) -> void:
for _names in Frames.get_animation_names():
if animation == _names:
if _current_animation != animation: animation_changed.emit()
_current_animation = animation
_animation_stopped = false
return
func stop() -> void:
_animation_stopped = true
_frame_timer = 0.0
@warning_ignore("native_method_override")
func get_class() -> String:
return "AnimatedTextureRect"
func _sprite_frames_changed() -> void:
if autoplay != "":
_current_animation = autoplay
else:
if is_instance_valid(Frames):
# Default to the first animation in the list
_current_animation = Frames.get_animation_names()[0]
else:
_current_animation = "default"