Files
GGJ26/menus/scenes/credits/scrolling_credits.gd
minimata 44f251ed66
All checks were successful
Create tag and build when new code gets to main / BumpTag (push) Successful in 6s
Create tag and build when new code gets to main / Export (push) Successful in 1m1s
Basic game template addon
2026-01-30 19:45:56 +01:00

93 lines
2.7 KiB
GDScript

@tool
extends Control
signal end_reached
@export var auto_scroll_speed: float = 60.0
@export var input_scroll_speed : float = 400.0
@export var scroll_restart_delay : float = 1.5
@export var scroll_paused : bool = false
var timer : Timer = Timer.new()
var _current_scroll_position : float = 0.0
@onready var header_space : Control = %HeaderSpace
@onready var footer_space : Control = %FooterSpace
@onready var credits_label : Control = %CreditsLabel
@onready var scroll_container : ScrollContainer = %ScrollContainer
func set_header_and_footer() -> void:
header_space.custom_minimum_size.y = size.y
footer_space.custom_minimum_size.y = size.y
credits_label.custom_minimum_size.x = size.x
func _on_resized() -> void:
set_header_and_footer()
_current_scroll_position = scroll_container.scroll_vertical
func _end_reached() -> void:
scroll_paused = true
end_reached.emit()
func is_end_reached() -> bool:
var _end_of_credits_vertical = credits_label.size.y + header_space.size.y
return scroll_container.scroll_vertical > _end_of_credits_vertical
func _check_end_reached() -> void:
if not is_end_reached():
return
_end_reached()
func _scroll_container(amount : float) -> void:
if not visible or scroll_paused:
return
_current_scroll_position += amount
scroll_container.scroll_vertical = round(_current_scroll_position)
_check_end_reached()
func _on_gui_input(event : InputEvent) -> void:
# Captures the mouse scroll wheel input event
if event is InputEventMouseButton:
scroll_paused = true
_start_scroll_restart_timer()
_check_end_reached()
func _on_scroll_started() -> void:
# Captures the touch input event
scroll_paused = true
_start_scroll_restart_timer()
func _start_scroll_restart_timer() -> void:
timer.start(scroll_restart_delay)
func _on_scroll_restart_timer_timeout() -> void:
_current_scroll_position = scroll_container.scroll_vertical
scroll_paused = false
func _on_visibility_changed() -> void:
if visible:
scroll_container.scroll_vertical = 0
_current_scroll_position = scroll_container.scroll_vertical
scroll_paused = false
func _ready() -> void:
scroll_container.scroll_started.connect(_on_scroll_started)
gui_input.connect(_on_gui_input)
resized.connect(_on_resized)
visibility_changed.connect(_on_visibility_changed)
timer.timeout.connect(_on_scroll_restart_timer_timeout)
set_header_and_footer()
add_child(timer)
scroll_paused = false
func _process(delta : float) -> void:
var input_axis = Input.get_axis("ui_up", "ui_down")
if input_axis != 0:
_scroll_container(input_axis * input_scroll_speed * delta)
else:
_scroll_container(auto_scroll_speed * delta)
func _exit_tree() -> void:
_current_scroll_position = scroll_container.scroll_vertical