47 lines
1.2 KiB
GDScript
47 lines
1.2 KiB
GDScript
class_name TypewriterReveal
|
|
extends RefCounted
|
|
|
|
const DEFAULT_CHARACTERS_PER_SECOND: float = 28.0
|
|
const MIN_CHARACTERS_PER_SECOND: float = 12.0
|
|
const MAX_CHARACTERS_PER_SECOND: float = 60.0
|
|
|
|
static var _characters_per_second: float = DEFAULT_CHARACTERS_PER_SECOND
|
|
|
|
|
|
static func set_characters_per_second(value: float) -> void:
|
|
_characters_per_second = clampf(
|
|
value,
|
|
MIN_CHARACTERS_PER_SECOND,
|
|
MAX_CHARACTERS_PER_SECOND,
|
|
)
|
|
|
|
|
|
static func get_characters_per_second() -> float:
|
|
return _characters_per_second
|
|
|
|
|
|
static func start(
|
|
label: Label,
|
|
characters_per_second: float = -1.0,
|
|
) -> float:
|
|
if label == null:
|
|
return 0.0
|
|
var character_count: int = label.get_total_character_count()
|
|
if character_count <= 0:
|
|
label.visible_characters = -1
|
|
return 0.0
|
|
label.visible_characters = 0
|
|
var resolved_characters_per_second := (
|
|
characters_per_second
|
|
if characters_per_second > 0.0
|
|
else _characters_per_second
|
|
)
|
|
var duration := float(character_count) / resolved_characters_per_second
|
|
var reveal_tween := label.create_tween()
|
|
reveal_tween.tween_property(
|
|
label,
|
|
"visible_characters",
|
|
character_count,
|
|
duration,
|
|
).from(0).set_trans(Tween.TRANS_LINEAR)
|
|
return duration
|