From a36adfc61046e79629bafb5db595bd655bcc0764 Mon Sep 17 00:00:00 2001 From: teatov Date: Mon, 28 Jul 2025 19:27:28 +1000 Subject: [PATCH] add auto detection of layout key labels --- scenes/game_key.tscn | 58 ++++++++++++++++++++++++++++++++---- scenes/game_keyboard.tscn | 12 +------- scripts/game_key.gd | 62 +++++++++++++++++++++++++++++++++++---- scripts/game_keyboard.gd | 2 +- scripts/key_props.gd | 14 ++++++--- 5 files changed, 121 insertions(+), 27 deletions(-) diff --git a/scenes/game_key.tscn b/scenes/game_key.tscn index 21951ea..27fa527 100644 --- a/scenes/game_key.tscn +++ b/scenes/game_key.tscn @@ -5,16 +5,20 @@ [sub_resource type="BoxMesh" id="BoxMesh_72e4x"] size = Vector3(0.25, 0.15, 0.25) -[node name="GameKey" type="Node3D" node_paths=PackedStringArray("mesh", "main_label")] +[node name="GameKey" type="Node3D" node_paths=PackedStringArray("_mesh", "_upper_left_label", "_upper_right_label", "_lower_left_label", "_lower_right_label", "_center_label")] script = ExtResource("1_sypr4") -mesh = NodePath("Mesh") -main_label = NodePath("MainLabel") +_mesh = NodePath("Mesh") +_upper_left_label = NodePath("UpperLeftLabel") +_upper_right_label = NodePath("UpperRightLabel") +_lower_left_label = NodePath("LowerLeftLabel") +_lower_right_label = NodePath("LowerRightLabel") +_center_label = NodePath("CenterLabel") [node name="Mesh" type="MeshInstance3D" parent="."] mesh = SubResource("BoxMesh_72e4x") -[node name="MainLabel" type="Label3D" parent="."] -transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0.076, 0) +[node name="UpperLeftLabel" type="Label3D" parent="."] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, -0.0607232, 0.076, -0.0586648) pixel_size = 0.0015 shaded = true double_sided = false @@ -23,3 +27,47 @@ modulate = Color(0, 0, 0, 1) text = "Q" font_size = 72 outline_size = 0 + +[node name="UpperRightLabel" type="Label3D" parent="."] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.061, 0.076, -0.059) +pixel_size = 0.0015 +shaded = true +double_sided = false +alpha_cut = 1 +modulate = Color(0, 0, 0, 1) +text = "Ё" +font_size = 72 +outline_size = 0 + +[node name="LowerLeftLabel" type="Label3D" parent="."] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, -0.0607232, 0.076, 0.059) +pixel_size = 0.0015 +shaded = true +double_sided = false +alpha_cut = 1 +modulate = Color(0, 0, 0, 1) +text = "Д" +font_size = 72 +outline_size = 0 + +[node name="LowerRightLabel" type="Label3D" parent="."] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.061, 0.076, 0.059) +pixel_size = 0.0015 +shaded = true +double_sided = false +alpha_cut = 1 +modulate = Color(0, 0, 0, 1) +text = "," +font_size = 72 +outline_size = 0 + +[node name="CenterLabel" type="Label3D" parent="."] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0.076, 0) +pixel_size = 0.0015 +shaded = true +double_sided = false +alpha_cut = 1 +modulate = Color(0, 0, 0, 1) +text = "A" +font_size = 72 +outline_size = 0 diff --git a/scenes/game_keyboard.tscn b/scenes/game_keyboard.tscn index 585560e..6d41017 100644 --- a/scenes/game_keyboard.tscn +++ b/scenes/game_keyboard.tscn @@ -1,16 +1,6 @@ -[gd_scene load_steps=4 format=3 uid="uid://dl5jgx2ucmvk7"] +[gd_scene load_steps=2 format=3 uid="uid://dl5jgx2ucmvk7"] [ext_resource type="Script" uid="uid://c7ikemicshkhv" path="res://scripts/game_keyboard.gd" id="1_3k4ps"] -[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_j5t22"] -albedo_color = Color(0.82, 0.1394, 0.1394, 1) - -[sub_resource type="BoxMesh" id="BoxMesh_j5t22"] -material = SubResource("StandardMaterial3D_j5t22") -size = Vector3(0.2, 0.2, 0.2) - [node name="GameKeyboard" type="Node3D"] script = ExtResource("1_3k4ps") - -[node name="MeshInstance3D" type="MeshInstance3D" parent="."] -mesh = SubResource("BoxMesh_j5t22") diff --git a/scripts/game_key.gd b/scripts/game_key.gd index f2e0284..90d6976 100644 --- a/scripts/game_key.gd +++ b/scripts/game_key.gd @@ -2,29 +2,40 @@ class_name GameKey extends Node3D static var _scene := preload("res://scenes/game_key.tscn") -@export var mesh: MeshInstance3D -@export var main_label: Label3D +@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) -> GameKey: +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 - main_label.text = props.input_event.as_text_physical_keycode() + _mesh.scale.x = props.width_ratio + _set_labels() func _process(_delta: float) -> void: - position.y = -0.1 if _is_pressed else 0.0 + position.y = _default_position.y - 0.1 if _is_pressed else _default_position.y func _unhandled_input(event: InputEvent) -> void: @@ -41,3 +52,42 @@ func _unhandled_input(event: InputEvent) -> void: _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 diff --git a/scripts/game_keyboard.gd b/scripts/game_keyboard.gd index 22d729b..ed44dd6 100644 --- a/scripts/game_keyboard.gd +++ b/scripts/game_keyboard.gd @@ -37,7 +37,7 @@ func _generate_row( var key_pos_z: float = row_index * _key_size + row_index * _key_gap - offset_z for key_props in row: - var game_key_node := GameKey.instantiate_with_props(key_props) + var game_key_node := GameKey.instantiate_with_props(key_props, self) add_child(game_key_node) game_key_node.position.x = ( diff --git a/scripts/key_props.gd b/scripts/key_props.gd index 2279692..86e03bd 100644 --- a/scripts/key_props.gd +++ b/scripts/key_props.gd @@ -2,7 +2,13 @@ class_name KeyProps var physical_keycode: Key var location: KeyLocation -var input_event: InputEventKey + +var input_event_init: InputEventKey +var input_event_main: InputEventKey +var input_event_shift: InputEventKey +var input_event_alt: InputEventKey +var input_event_alt_shift: InputEventKey + var width_ratio_init: float var width_ratio: float @@ -15,9 +21,9 @@ func _init( physical_keycode = _physical_keycode location = _location - input_event = InputEventKey.new() - input_event.physical_keycode = physical_keycode - input_event.location = _location + input_event_init = InputEventKey.new() + input_event_init.physical_keycode = physical_keycode + input_event_init.location = _location width_ratio_init = _width_ratio width_ratio = width_ratio_init