AgatheOs/main.gd
2025-12-24 19:38:23 +01:00

65 lines
1.8 KiB
GDScript

extends Control
const SCREEN_HEIGHT: int = 600
const SCREEN_WIDTH: int = 1024
const LINE_HEIGHT: int = 150
const LETTER_SPACING: int = 20
var label: Resource = preload("res://typed_letter.tscn")
var labels: Array = []
var current_x: float = 0
var current_y: float = 0
@onready var labels_node: Control = $Labels
var is_ready: bool = false
func _ready() -> void:
offset_line(1)
is_ready = true
func _input(event: InputEvent) -> void:
if event is InputEventKey:
var key_event: InputEventKey = event
if key_event.pressed and not key_event.echo:
var letter: String = OS.get_keycode_string(event.keycode)
if letter.length() == 1:
spawn_text(OS.get_keycode_string(event.keycode))
else:
match key_event.keycode:
Key.KEY_ENTER:
offset_line()
Key.KEY_ESCAPE:
offset_line(6)
Key.KEY_BACKSPACE:
delete_last_text()
func offset_line(amount: int = 1) -> void:
current_x = 0
current_y = current_y + LINE_HEIGHT * amount
var target_pos := Vector2(0, SCREEN_HEIGHT - (LINE_HEIGHT + current_y))
var tween := get_tree().create_tween()
var tweener := tween.tween_property(labels_node, "position", target_pos, 0.3)
tweener.from_current().set_trans(Tween.TRANS_CUBIC)
if is_ready:
$AudioStreamPlayer.stop()
$AudioStreamPlayer.play()
func spawn_text(text: String) -> void:
var instance : TypedLetter = label.instantiate()
labels.push_back(instance)
labels_node.add_child(instance)
instance.position = Vector2(current_x, current_y)
instance.add_label(text)
current_x = current_x + instance.get_width() + LETTER_SPACING
if current_x > SCREEN_WIDTH:
offset_line()
func delete_last_text() -> void:
if not labels.is_empty():
var last: TypedLetter = labels.back()
if current_y == last.position.y:
current_x = last.position.x
labels.pop_back()
last.delete_label()