add auto detection of layout key labels

This commit is contained in:
Teatov 2025-07-28 19:27:28 +10:00
parent 82b4fc6d84
commit a36adfc610
5 changed files with 121 additions and 27 deletions

View File

@ -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

View File

@ -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")

View File

@ -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

View File

@ -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 = (

View File

@ -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