add player with basic movement

This commit is contained in:
Teatov 2025-08-02 22:51:10 +10:00
parent acbad4aadf
commit 6f399db783
7 changed files with 102 additions and 8 deletions

View File

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

16
scenes/player.tscn Normal file
View File

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

View File

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

View File

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

View File

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

51
scripts/player.gd Normal file
View File

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

1
scripts/player.gd.uid Normal file
View File

@ -0,0 +1 @@
uid://dmfdlb4ae57qv