From 6f399db7835e28fb81fef0965c2020d1740b58e2 Mon Sep 17 00:00:00 2001 From: teatov Date: Sat, 2 Aug 2025 22:51:10 +1000 Subject: [PATCH] add player with basic movement --- scenes/game_key.tscn | 6 ++++- scenes/player.tscn | 16 +++++++++++++ scenes/test/test.tscn | 6 ++++- scripts/game_key.gd | 10 ++++---- scripts/game_keyboard.gd | 20 ++++++++++++++-- scripts/player.gd | 51 ++++++++++++++++++++++++++++++++++++++++ scripts/player.gd.uid | 1 + 7 files changed, 102 insertions(+), 8 deletions(-) create mode 100644 scenes/player.tscn create mode 100644 scripts/player.gd create mode 100644 scripts/player.gd.uid diff --git a/scenes/game_key.tscn b/scenes/game_key.tscn index 8b92ddc..187eb37 100644 --- a/scenes/game_key.tscn +++ b/scenes/game_key.tscn @@ -41,8 +41,9 @@ stream_6/stream = ExtResource("15_w7o33") [sub_resource type="AudioStreamPolyphonic" id="AudioStreamPolyphonic_6rsff"] -[node name="GameKey" type="Node3D" node_paths=PackedStringArray("_skeleton_primary", "_skeleton_secondary", "_nub_mesh", "_upper_left_label", "_upper_right_label", "_lower_left_label", "_lower_right_label", "_center_label", "_press_light", "_adjacency_light", "_sfx_player")] +[node name="GameKey" type="Node3D" node_paths=PackedStringArray("player_pos_marker", "_skeleton_primary", "_skeleton_secondary", "_nub_mesh", "_upper_left_label", "_upper_right_label", "_lower_left_label", "_lower_right_label", "_center_label", "_press_light", "_adjacency_light", "_sfx_player")] script = ExtResource("1_sypr4") +player_pos_marker = NodePath("PlayerPosMarker") _skeleton_primary = NodePath("ModelPrimary/KeyArmature/Skeleton3D") _skeleton_secondary = NodePath("ModelSecondary/KeyArmature/Skeleton3D") _nub_mesh = NodePath("ModelPrimary/NubMesh") @@ -158,6 +159,9 @@ text = "A" font_size = 48 outline_size = 0 +[node name="PlayerPosMarker" type="Marker3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.25, 0) + [node name="PressLight" type="OmniLight3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.6, 0) visible = false diff --git a/scenes/player.tscn b/scenes/player.tscn new file mode 100644 index 0000000..fc00f23 --- /dev/null +++ b/scenes/player.tscn @@ -0,0 +1,16 @@ +[gd_scene load_steps=3 format=3 uid="uid://b8gu0udt0ow8t"] + +[ext_resource type="Script" uid="uid://dmfdlb4ae57qv" path="res://scripts/player.gd" id="1_3vyb7"] + +[sub_resource type="BoxMesh" id="BoxMesh_u8vuu"] + +[node name="Player" type="Node3D"] +script = ExtResource("1_3vyb7") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0) +mesh = SubResource("BoxMesh_u8vuu") + +[node name="MeshInstance3D2" type="MeshInstance3D" parent="."] +transform = Transform3D(0.310767, 0, 0, 0, 0.310767, 0, 0, 0, 0.310767, 0, 0.5, 0.63) +mesh = SubResource("BoxMesh_u8vuu") diff --git a/scenes/test/test.tscn b/scenes/test/test.tscn index 6b5ac57..4c5bf66 100644 --- a/scenes/test/test.tscn +++ b/scenes/test/test.tscn @@ -1,6 +1,7 @@ -[gd_scene load_steps=6 format=3 uid="uid://djmj08xtpgpgk"] +[gd_scene load_steps=7 format=3 uid="uid://djmj08xtpgpgk"] [ext_resource type="PackedScene" uid="uid://dl5jgx2ucmvk7" path="res://scenes/game_keyboard.tscn" id="1_da6vm"] +[ext_resource type="PackedScene" uid="uid://b8gu0udt0ow8t" path="res://scenes/player.tscn" id="2_51e2l"] [ext_resource type="PackedScene" uid="uid://df16rl6w7vvw" path="res://scenes/debug_key_display.tscn" id="2_st4qh"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_errlg"] @@ -42,5 +43,8 @@ environment = SubResource("Environment_ij1v8") [node name="GameKeyboard" parent="." instance=ExtResource("1_da6vm")] +[node name="Player" parent="." node_paths=PackedStringArray("_keyboard") instance=ExtResource("2_51e2l")] +_keyboard = NodePath("../GameKeyboard") + [node name="DebugKeyDisplay" parent="." node_paths=PackedStringArray("_keyboard") instance=ExtResource("2_st4qh")] _keyboard = NodePath("../GameKeyboard") diff --git a/scripts/game_key.gd b/scripts/game_key.gd index e638fcf..178f3b9 100644 --- a/scripts/game_key.gd +++ b/scripts/game_key.gd @@ -2,6 +2,8 @@ class_name GameKey extends Node3D #region variables @export_group("References") +@export var player_pos_marker: Node3D + @export var _skeleton_primary: Skeleton3D @export var _skeleton_secondary: Skeleton3D @export var _nub_mesh: MeshInstance3D @@ -38,6 +40,7 @@ class_name GameKey extends Node3D @export var _release_sfx: AudioStream var props: KeyProps +var player_transform: Transform3D var _keyboard: GameKeyboard var _is_pressed: bool @@ -93,7 +96,7 @@ func _ready() -> void: _keyboard.layout_size_changed.connect(_on_keyboard_layout_size_changed) _keyboard.keys_requested.connect(_on_keyboard_keys_requested) _keyboard.is_configuring_changed.connect(_on_keyboard_is_configuring_changed) - _keyboard.key_press_changed.connect(_on_keyboard_key_press_changed) + _keyboard.player_key_changed.connect(_on_keyboard_player_key_changed) _set_labels() _adjacency_light.visible = false @@ -409,8 +412,7 @@ func _on_keyboard_is_configuring_changed(value: bool) -> void: _shake(0.2) -func _on_keyboard_key_press_changed(game_key: GameKey, event: InputEventKey) -> void: - if event.is_pressed(): - _adjacency_light.visible = KeyAdjacency.is_adjacent(game_key, self) +func _on_keyboard_player_key_changed(game_key: GameKey) -> void: + _adjacency_light.visible = KeyAdjacency.is_adjacent(game_key, self) #endregion diff --git a/scripts/game_keyboard.gd b/scripts/game_keyboard.gd index a68d423..19d0534 100644 --- a/scripts/game_keyboard.gd +++ b/scripts/game_keyboard.gd @@ -6,6 +6,7 @@ signal layout_size_changed(rect: Rect2) signal prompt_page_turned(page: int) signal keys_requested(filter_func: Callable) signal is_configuring_changed(value: bool) +signal player_key_changed(game_key: GameKey) @export_group("References") @export var _keys_holder: Node3D @@ -43,7 +44,7 @@ var _requested_keys_limit: int = 0 @onready var _pressing_lean_rad := Vector2( deg_to_rad(_pressing_lean_deg.x), deg_to_rad(_pressing_lean_deg.y) ) -@onready var _default_rotation: Vector3 = rotation +@onready var _default_rotation: Vector3 = _keys_holder.rotation @onready var _polyphonic := _sfx_player.get_stream_playback() as AudioStreamPlaybackPolyphonic @@ -116,6 +117,21 @@ func _unhandled_input(event: InputEvent) -> void: func emit_key_press(game_key: GameKey, event: InputEventKey) -> void: key_press_changed.emit(game_key, event) +func emit_player_key_change(game_key: GameKey) -> void: + player_key_changed.emit(game_key) + + +func request_key_by_keycode(keycode: Key) -> GameKey: + var found_key: GameKey + var result := request_keys( + func(game_key: GameKey) -> bool: + return game_key.props.physical_keycode == keycode, + 1 + ) + if result: + found_key = result[0] + return found_key + func request_keys(filter_func: Callable, limit: int = 0) -> Array[GameKey]: _requested_keys = [] @@ -350,7 +366,7 @@ func _reset_animations() -> void: func _animate(delta: float) -> void: anim_time += delta * _time_scale - rotation = _rot_sod.process(delta, _animate_rotation()) + _keys_holder.rotation = _rot_sod.process(delta, _animate_rotation()) func _animate_rotation() -> Vector3: diff --git a/scripts/player.gd b/scripts/player.gd new file mode 100644 index 0000000..5a77061 --- /dev/null +++ b/scripts/player.gd @@ -0,0 +1,51 @@ +class_name Player extends Node3D + +#region variables +@export_group("References") +@export var _keyboard: GameKeyboard + +var _current_key: GameKey +var _starting_keycode: Key = KEY_H +var _rotation: Quaternion + +#endregion + + +#region builtins +func _ready() -> void: + _keyboard.key_press_changed.connect(_on_keyboard_key_press_changed) + _current_key = _keyboard.request_key_by_keycode(_starting_keycode) + if _current_key: + global_transform = _current_key.player_pos_marker.global_transform + + +func _process(_delta: float) -> void: + if _current_key: + global_position = _current_key.player_pos_marker.global_position + var rotation_translate := ( + _current_key.get_default_transform().inverse() + * _current_key.player_pos_marker.global_transform + ) + global_rotation = ( + (_rotation * (rotation_translate.basis.get_rotation_quaternion())) + . get_euler() + ) + + +#endregion + + +#region event handlers +func _on_keyboard_key_press_changed(game_key: GameKey, event: InputEventKey) -> void: + if event.is_pressed() and KeyAdjacency.is_adjacent(_current_key, game_key): + var look_from := ( + _current_key.player_pos_marker.transform * _current_key.transform + ) + var look_target := game_key.player_pos_marker.transform * game_key.transform + look_target.origin.y = look_from.origin.y + var looking := look_from.looking_at(look_target.origin, Vector3.UP, true) + _rotation = (looking.basis.get_rotation_quaternion()) + _current_key = game_key + _keyboard.emit_player_key_change(game_key) + +#endregion diff --git a/scripts/player.gd.uid b/scripts/player.gd.uid new file mode 100644 index 0000000..1659322 --- /dev/null +++ b/scripts/player.gd.uid @@ -0,0 +1 @@ +uid://dmfdlb4ae57qv