class_name Player
extends CharacterBody3D
-
# signals
signal camera_lockon
@export_range(0.0, 100.0) var camera_lockon_radius := 40.0
@export_enum("locked", "unlocked") var camera_mode: String
@export_range(0.0, 50.0) var lockon_sensitivity := 0.2
-@export_range(0.0, 1.0) var mouse_sensitivity := 0.25
+@export_range(0.0, 1.0) var mouse_sensitivity := 0.15
@export_range(0.0, 10.0) var joystick_sensitivity_x := 4.0
@export_range(0.0, 10.0) var joystick_sensitivity_y := 2.0
# class variables
var _player_speed := walk_speed
var _camera_input_direction := Vector2.ZERO
-var _last_movement_direction := rotation
+var _last_movement_direction := -rotation
var _idle_time := 0.0
var _camera_lockon_node: Node3D = null
var _lockon_direction: Vector3 = Vector3.ZERO
var _lockon_indicator_scene = load("res://ux/lockon_indicator.tscn")
var _lockon_instance: Node3D = _lockon_indicator_scene.instantiate()
+var _head_track_target: Node3D = null
var _head_track_arr: Array[Node3D] = []
enum {LOCKON_LEFT, LOCKON_CENTER, LOCKON_RIGHT}
_debug.stats.add_property(self, "velocity", "")
_debug.stats.add_property(self, "_idle_time", "round")
_debug.stats.add_property(self, "_lockon_shift", "round")
- _debug.stats.add_property(self, "_head_track_to", "")
_debug.stats.add_property(self, "_head_track_arr", "")
+ _debug.stats.add_property(self, "_head_track_target", "")
func _input(event: InputEvent) -> void:
elif event is InputEventJoypadMotion:
_camera_input_method = CAMERA_JOYSTICK_INPUT
_camera_input_direction = Input.get_vector("camera-left", "camera-right", "camera-up", "camera-down")
- if _camera_input_direction == Vector2.ZERO:
- _lockon_shift = LOCKON_CENTER
_camera_input_direction *= Vector2(joystick_sensitivity_x, -joystick_sensitivity_y)
+
+ if _camera_input_direction == Vector2.ZERO:
+ _lockon_shift = LOCKON_CENTER
# class functions
move_and_slide()
+# head tracking
+# TODO: choose the closest head track thing to my position
+# tell skin to track it
+func _pick_head_track_target() -> void:
+ if _head_track_arr.is_empty():
+ _head_track_target = null
+ _skin.set_head_target(null)
+ _skin.set_eyes_target(null)
+ else:
+ var target: Node3D = _head_track_arr.front()
+ _head_track_target = target
+ _skin.set_head_target(target)
+ _skin.set_eyes_target(target)
+
+
+# if we find a head tracking obj, add it to the array unless it's already there
func _on_head_turn_area_entered(area: Area3D) -> void:
- for node in area.get_parent().get_children().filter(func(c): return c.is_in_group("player_head_turn")):
+ for node in area.get_parent().get_children().filter(func(c): return c.is_in_group("player-headTrack")):
var i = _head_track_arr.find(node)
if i < 0:
_head_track_arr.append(node)
+ _pick_head_track_target()
func _on_head_turn_area_exited(area: Area3D) -> void:
- for node in area.get_parent().get_children().filter(func(c): return c.is_in_group("player_head_turn")):
+ for node in area.get_parent().get_children().filter(func(c): return c.is_in_group("player-headTrack")):
var i = _head_track_arr.find(node)
if i >= 0:
_head_track_arr.remove_at(i)
+ _pick_head_track_target()