mirror of
https://gitlab.com/MaddoScientisto/cirnogodot.git
synced 2026-06-01 10:25:35 +00:00
78 lines
2.2 KiB
GDScript
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"
|