keebie/scripts/game_key.gd

94 lines
2.3 KiB
GDScript

class_name GameKey extends Node3D
static var _scene := preload("res://scenes/game_key.tscn")
@export var _mesh: MeshInstance3D
@export var _upper_left_label: Label3D
@export var _upper_right_label: Label3D
@export var _lower_left_label: Label3D
@export var _lower_right_label: Label3D
@export var _center_label: Label3D
var props: KeyProps
var keyboard: GameKeyboard
var _is_pressed: bool
@onready var _default_position: Vector3 = position
static func instantiate_with_props(
_props: KeyProps, _keyboard: GameKeyboard
) -> GameKey:
var node := _scene.instantiate() as GameKey
node.keyboard = _keyboard
node.props = _props
node.name = node.name + " " + _props.input_event_init.as_text_physical_keycode()
if _props.location != KEY_LOCATION_UNSPECIFIED:
node.name += " " + _props.input_event_init.as_text_location()
return node
func _ready() -> void:
_mesh.scale.x = props.width_ratio
_set_labels()
func _process(_delta: float) -> void:
position.y = _default_position.y - 0.1 if _is_pressed else _default_position.y
func _unhandled_input(event: InputEvent) -> void:
if event is not InputEventKey:
return
var event_key := event as InputEventKey
if (
event_key.physical_keycode != props.physical_keycode
or event_key.location != props.location
):
return
_is_pressed = event_key.is_pressed()
# scale.z = 0.75 if _is_pressed else 1.0
if _is_pressed:
if not event_key.shift_pressed:
props.input_event_main = event_key
else:
props.input_event_shift = event_key
_set_labels()
func _set_labels() -> void:
_upper_left_label.text = ""
_upper_right_label.text = ""
_lower_left_label.text = ""
_lower_right_label.text = ""
_center_label.text = ""
if not props.input_event_main or props.input_event_main.unicode == 0:
_center_label.text = props.input_event_init.as_text_physical_keycode()
return
var main_char := char(props.input_event_main.unicode).to_upper()
var shift_char := (
char(props.input_event_shift.unicode).to_upper()
if props.input_event_shift
else ""
)
if (
(props.input_event_main and not props.input_event_shift)
or main_char == shift_char
):
_upper_left_label.text = main_char
return
if props.input_event_main and props.input_event_shift:
_upper_left_label.text = shift_char
_lower_left_label.text = main_char
return