add auto detection of layout key labels
This commit is contained in:
parent
82b4fc6d84
commit
a36adfc610
@ -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
|
||||
|
||||
@ -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")
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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 = (
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user