keebie/scripts/player.gd

52 lines
1.5 KiB
GDScript

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