94 lines
2.3 KiB
GDScript
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
|