68 lines
2.0 KiB
GDScript
68 lines
2.0 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:
|
|
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
|
|
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_scancode_string(event.scancode)
|
|
if event.physical_scancode >= KEY_0 and event.physical_scancode <= KEY_9:
|
|
spawn_text(OS.get_scancode_string(event.physical_scancode))
|
|
elif letter.length() == 1:
|
|
spawn_text(OS.get_scancode_string(event.scancode))
|
|
else:
|
|
match key_event.physical_scancode:
|
|
KEY_ENTER:
|
|
offset_line()
|
|
KEY_ESCAPE:
|
|
offset_line(6)
|
|
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, "rect_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.instance()
|
|
labels.push_back(instance)
|
|
labels_node.add_child(instance)
|
|
instance.rect_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.empty():
|
|
var last: TypedLetter = labels.back()
|
|
if current_y == last.rect_position.y:
|
|
current_x = last.rect_position.x
|
|
labels.pop_back()
|
|
last.delete_label()
|