extends Control const SCREEN_HEIGHT: int = 768 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 func _ready() -> void: offset_line(1) 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)) # label.text = label.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.4) tweener.from_current().set_trans(Tween.TRANS_CUBIC) 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 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()