make keyboard and keys tool scripts and add editor keys generation
This commit is contained in:
parent
f2be1197d6
commit
aa44311c1f
@ -171,13 +171,13 @@ omni_range = 2.0
|
||||
|
||||
[node name="AdjacencyLight" type="OmniLight3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.45, 0)
|
||||
visible = false
|
||||
light_color = Color(0.8325, 1, 0.33, 1)
|
||||
omni_range = 0.6
|
||||
|
||||
[node name="SFXPlayer" type="AudioStreamPlayer3D" parent="."]
|
||||
stream = SubResource("AudioStreamPolyphonic_6rsff")
|
||||
volume_db = -15.0
|
||||
autoplay = true
|
||||
bus = &"SFX"
|
||||
attenuation_filter_cutoff_hz = 20500.0
|
||||
|
||||
|
||||
@ -39,6 +39,6 @@ visible = false
|
||||
mesh = SubResource("BoxMesh_j5t22")
|
||||
|
||||
[node name="RectMesh" type="MeshInstance3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.968737, 0)
|
||||
transform = Transform3D(16.4, 0, 0, 0, 1, 0, 0, 0, 5.4, 0, -0.968737, 0)
|
||||
visible = false
|
||||
mesh = SubResource("QuadMesh_j5t22")
|
||||
|
||||
@ -3,6 +3,7 @@
|
||||
[ext_resource type="Script" uid="uid://dmfdlb4ae57qv" path="res://scripts/player.gd" id="1_3vyb7"]
|
||||
|
||||
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_3vyb7"]
|
||||
metallic_specular = 0.0
|
||||
|
||||
[sub_resource type="BoxMesh" id="BoxMesh_u8vuu"]
|
||||
material = SubResource("StandardMaterial3D_3vyb7")
|
||||
|
||||
@ -1,6 +1,9 @@
|
||||
@tool
|
||||
class_name GameKey extends Node3D
|
||||
|
||||
#region variables
|
||||
@export var props: KeyProps
|
||||
|
||||
@export_group("References")
|
||||
@export var player_pos_marker: Node3D
|
||||
|
||||
@ -42,7 +45,6 @@ class_name GameKey extends Node3D
|
||||
@export var _press_sfx: AudioStream
|
||||
@export var _release_sfx: AudioStream
|
||||
|
||||
var props: KeyProps
|
||||
var player_transform: Transform3D
|
||||
|
||||
var _keyboard: GameKeyboard
|
||||
@ -54,8 +56,7 @@ var _default_position: Vector3
|
||||
var _default_rotation: Vector3
|
||||
var _pos_sod: SecondOrderDynamics
|
||||
|
||||
@onready
|
||||
var _polyphonic := _sfx_player.get_stream_playback() as AudioStreamPlaybackPolyphonic
|
||||
@onready var _polyphonic: AudioStreamPlaybackPolyphonic
|
||||
@onready var _light_energy := _press_light.light_energy
|
||||
|
||||
#endregion
|
||||
@ -96,6 +97,16 @@ static func sort_func(a: GameKey, b: GameKey) -> bool:
|
||||
|
||||
#region builtins
|
||||
func _ready() -> void:
|
||||
if (
|
||||
Engine.is_editor_hint()
|
||||
and not _keyboard
|
||||
and get_tree().edited_scene_root is GameKeyboard
|
||||
):
|
||||
_keyboard = get_tree().edited_scene_root
|
||||
load_props(props, position, rotation.y)
|
||||
elif not _keyboard:
|
||||
return
|
||||
|
||||
_adjacency_light.visible = false
|
||||
_keyboard.layout_size_changed.connect(_on_keyboard_layout_size_changed)
|
||||
_keyboard.keys_requested.connect(_on_keyboard_keys_requested)
|
||||
@ -104,13 +115,22 @@ func _ready() -> void:
|
||||
_keyboard.player_finished_move.connect(_on_keyboard_player_finished_move)
|
||||
_set_labels()
|
||||
|
||||
if Engine.is_editor_hint():
|
||||
return
|
||||
_sfx_player.play()
|
||||
_polyphonic = _sfx_player.get_stream_playback()
|
||||
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
if Engine.is_editor_hint():
|
||||
return
|
||||
_animate(delta)
|
||||
_animate_light(delta)
|
||||
|
||||
|
||||
func _unhandled_input(event: InputEvent) -> void:
|
||||
if Engine.is_editor_hint():
|
||||
return
|
||||
if event.is_action_pressed("reset_animations"):
|
||||
_reset_animations()
|
||||
return
|
||||
@ -157,7 +177,8 @@ func _unhandled_input(event: InputEvent) -> void:
|
||||
|
||||
|
||||
func _exit_tree() -> void:
|
||||
_erase_keyboard_pressed_position()
|
||||
if _keyboard:
|
||||
_erase_keyboard_pressed_position()
|
||||
|
||||
|
||||
#endregion
|
||||
@ -231,7 +252,11 @@ func _set_labels(chars_dict: Dictionary[KeyProps.Char, String] = {}) -> void:
|
||||
|
||||
|
||||
func _set_labels_text(chars_dict: Dictionary[KeyProps.Char, String]) -> void:
|
||||
if props.physical_keycode == KEY_SPACE or not props.is_unicode():
|
||||
if (
|
||||
Engine.is_editor_hint()
|
||||
or props.physical_keycode == KEY_SPACE
|
||||
or not props.is_unicode()
|
||||
):
|
||||
_center_label.text = OS.get_keycode_string(props.physical_keycode)
|
||||
return
|
||||
|
||||
@ -398,6 +423,10 @@ func _on_keyboard_layout_size_changed(rect: Rect2) -> void:
|
||||
_default_position.z -= center.y
|
||||
_set_keyboard_pressed_position(_is_pressed)
|
||||
|
||||
if Engine.is_editor_hint():
|
||||
position = _default_position
|
||||
return
|
||||
|
||||
if not _pos_sod:
|
||||
_reset_animations()
|
||||
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
@tool
|
||||
class_name GameKeyboard extends Node3D
|
||||
|
||||
#region variables
|
||||
@ -9,6 +10,11 @@ signal is_configuring_changed(value: bool)
|
||||
signal player_key_changed(game_key: GameKey)
|
||||
signal player_finished_move(game_key: GameKey)
|
||||
|
||||
@export_tool_button("Generate keys")
|
||||
var generate_editor_keys_btn := _generate_editor_keys
|
||||
@export_tool_button("Delete keys") var delete_editor_keys_btn := _delete_editor_keys
|
||||
@export_tool_button("Request keys") var request_keys_btn := _request_keys
|
||||
|
||||
@export_group("References")
|
||||
@export var _keys_holder: Node3D
|
||||
@export var _sfx_player: AudioStreamPlayer3D
|
||||
@ -46,8 +52,7 @@ var _requested_keys_limit: int = 0
|
||||
deg_to_rad(_pressing_lean_deg.x), deg_to_rad(_pressing_lean_deg.y)
|
||||
)
|
||||
@onready var _default_rotation: Vector3 = _keys_holder.rotation
|
||||
@onready
|
||||
var _polyphonic := _sfx_player.get_stream_playback() as AudioStreamPlaybackPolyphonic
|
||||
@onready var _polyphonic: AudioStreamPlaybackPolyphonic
|
||||
|
||||
#endregion
|
||||
|
||||
@ -65,16 +70,24 @@ static func get_rotated_key_pos(
|
||||
|
||||
#region builtins
|
||||
func _ready() -> void:
|
||||
if Engine.is_editor_hint():
|
||||
_generate_editor_keys()
|
||||
return
|
||||
_polyphonic = _sfx_player.get_stream_playback()
|
||||
prompt_pages_total = ceili(LayoutConfig.layouts.size() / 9.0)
|
||||
_generate_keys(LayoutConfig.layout_rows)
|
||||
_generate_keys()
|
||||
_reset_animations()
|
||||
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
if Engine.is_editor_hint():
|
||||
return
|
||||
_animate(delta)
|
||||
|
||||
|
||||
func _unhandled_input(event: InputEvent) -> void:
|
||||
if Engine.is_editor_hint():
|
||||
return
|
||||
if event.is_action_pressed("reset_animations"):
|
||||
_reset_animations()
|
||||
return
|
||||
@ -162,9 +175,9 @@ func key_request_respond(game_key: GameKey) -> void:
|
||||
|
||||
|
||||
#region key generation
|
||||
func _generate_keys(layout_rows: Array[Array]) -> void:
|
||||
print("generating keys... '%s'" % LayoutConfig.current_layout.get_name())
|
||||
_iterate_keys(_generate_key, layout_rows, {})
|
||||
func _generate_keys() -> void:
|
||||
print("generating keys...")
|
||||
_iterate_keys(_generate_key, LayoutConfig.layout_rows)
|
||||
|
||||
|
||||
func _generate_key(
|
||||
@ -182,7 +195,7 @@ func _generate_key(
|
||||
func _iterate_keys(
|
||||
iter_function: Callable,
|
||||
layout_rows: Array[Array],
|
||||
current_keys: Dictionary[Vector2i, Array]
|
||||
current_keys: Dictionary[Vector2i, Array] = {}
|
||||
) -> void:
|
||||
_gap_to_size_ratio = key_gap / key_size
|
||||
for row: Array[KeyProps] in layout_rows:
|
||||
@ -280,6 +293,25 @@ func _get_scale_with_gaps(key_scale: float) -> float:
|
||||
return key_scale + _gap_to_size_ratio * (key_scale - 1)
|
||||
|
||||
|
||||
func _generate_editor_keys() -> void:
|
||||
_delete_editor_keys()
|
||||
_iterate_keys(_generate_key, AbstractLayout.get_layout_rows(LayoutANSI.new()))
|
||||
|
||||
|
||||
func _delete_editor_keys() -> void:
|
||||
pressed_positions = {}
|
||||
var nodes := _keys_holder.get_children()
|
||||
if not nodes:
|
||||
return
|
||||
print("deleting keys...")
|
||||
for node in nodes:
|
||||
node.queue_free()
|
||||
|
||||
|
||||
func _request_keys() -> void:
|
||||
print(request_key_by_keycode(KEY_SHIFT))
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
@ -307,7 +339,7 @@ func _swap_layout(kp_key: Key) -> void:
|
||||
|
||||
|
||||
func _regenerate_keys(layout_rows: Array[Array]) -> void:
|
||||
print("REgenerating keys... '%s'" % LayoutConfig.current_layout.get_name())
|
||||
print("REgenerating keys...")
|
||||
|
||||
var current_keys: Dictionary[Vector2i, Array]
|
||||
for node in _keys_holder.get_children():
|
||||
|
||||
@ -65,13 +65,7 @@ func _set_defaults() -> void:
|
||||
func _set_layout(layout: AbstractLayout) -> void:
|
||||
print("SETTING LAYOUT: '%s'" % layout.get_name())
|
||||
current_layout = layout
|
||||
|
||||
layout_rows = []
|
||||
for dict_row: Array[Dictionary] in current_layout.get_rows():
|
||||
var row: Array[KeyProps] = []
|
||||
for props_dict: Dictionary in dict_row:
|
||||
row.append(KeyProps.new().props_from_dict(props_dict))
|
||||
layout_rows.append(row)
|
||||
layout_rows = AbstractLayout.get_layout_rows(current_layout)
|
||||
|
||||
|
||||
func _load_config() -> Error:
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
class_name KeyProps
|
||||
@tool
|
||||
class_name KeyProps extends Resource
|
||||
|
||||
enum Char {
|
||||
MAIN = 0,
|
||||
@ -24,29 +25,29 @@ enum {
|
||||
NUB,
|
||||
}
|
||||
|
||||
var physical_keycode: Key = KEY_NONE
|
||||
var location: KeyLocation = KEY_LOCATION_UNSPECIFIED
|
||||
@export var physical_keycode: Key = KEY_NONE
|
||||
@export var location: KeyLocation = KEY_LOCATION_UNSPECIFIED
|
||||
|
||||
var width: float = 1
|
||||
var height: float = 1
|
||||
var x: float = 0
|
||||
var y: float = 0
|
||||
@export var width: float = 1
|
||||
@export var height: float = 1
|
||||
@export var x: float = 0
|
||||
@export var y: float = 0
|
||||
|
||||
var width2: float = 1
|
||||
var height2: float = 1
|
||||
var x2: float = 0
|
||||
var y2: float = 0
|
||||
@export var width2: float = 1
|
||||
@export var height2: float = 1
|
||||
@export var x2: float = 0
|
||||
@export var y2: float = 0
|
||||
|
||||
var angle: float = -INF
|
||||
var pivot_x: float = -INF
|
||||
var pivot_y: float = -INF
|
||||
@export var angle: float = -INF
|
||||
@export var pivot_x: float = -INF
|
||||
@export var pivot_y: float = -INF
|
||||
|
||||
var homing_nub: bool = false
|
||||
@export var homing_nub: bool = false
|
||||
|
||||
var main_char: String
|
||||
var shift_char: String
|
||||
var alt_char: String
|
||||
var alt_shift_char: String
|
||||
@export var main_char: String
|
||||
@export var shift_char: String
|
||||
@export var alt_char: String
|
||||
@export var alt_shift_char: String
|
||||
|
||||
|
||||
func is_unicode() -> bool:
|
||||
|
||||
@ -1,6 +1,16 @@
|
||||
class_name AbstractLayout
|
||||
|
||||
|
||||
static func get_layout_rows(layout: AbstractLayout) -> Array[Array]:
|
||||
var rows: Array[Array] = []
|
||||
for dict_row: Array[Dictionary] in layout.get_rows():
|
||||
var row: Array[KeyProps] = []
|
||||
for props_dict: Dictionary in dict_row:
|
||||
row.append(KeyProps.new().props_from_dict(props_dict))
|
||||
rows.append(row)
|
||||
return rows
|
||||
|
||||
|
||||
func get_name() -> String:
|
||||
return ""
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user