53 lines
1.8 KiB
GDScript
53 lines
1.8 KiB
GDScript
extends CharacterBody2D
|
|
class_name Player
|
|
|
|
@onready var interaction_ray_cast: RayCast2D = %InteractionRayCast
|
|
|
|
# Player movement speed (pixels per second)
|
|
@export var speed = 200
|
|
|
|
@export var friction = 16
|
|
|
|
# Rotation speed (radians per second) - adjust for desired rotation speed
|
|
@export var rotation_speed = PI * 4 # Rotate 2 full circles per second
|
|
|
|
# Use mouse for rotation? If false, uses gamepad right stick.
|
|
@export var rotate_with_mouse = true
|
|
|
|
@export var interacting_state: Player_State = Player_State_Standard.new()
|
|
|
|
func _physics_process(delta):
|
|
# --- Movement Logic ---
|
|
var input_vector := Input.get_vector("move_left", "move_right", "move_up", "move_down")
|
|
|
|
if input_vector != Vector2.ZERO:
|
|
if not interacting_state.restrict_movement():
|
|
velocity = input_vector * speed
|
|
interacting_state.on_movement_input(input_vector, self)
|
|
else:
|
|
velocity = lerp(velocity, Vector2.ZERO, friction * delta)
|
|
|
|
move_and_slide()
|
|
|
|
# --- Rotation Logic ---
|
|
var target_rotation_direction = Vector2.ZERO
|
|
|
|
if rotate_with_mouse:
|
|
var mouse_position = get_global_mouse_position()
|
|
target_rotation_direction = global_position.direction_to(mouse_position)
|
|
else:
|
|
target_rotation_direction = Input.get_vector("rotate_left", "rotate_right", "rotate_up", "rotate_down")
|
|
|
|
if target_rotation_direction != Vector2.ZERO:
|
|
var target_angle := target_rotation_direction.angle()
|
|
if not interacting_state.restrict_rotation():
|
|
rotation = lerp_angle(rotation, target_angle, rotation_speed * delta)
|
|
interacting_state.on_rotation_input(target_angle, self)
|
|
|
|
# --- Interact Logic ---
|
|
if Input.is_action_just_pressed("interact"):
|
|
if interaction_ray_cast.is_colliding():
|
|
var interaction_target = interaction_ray_cast.get_collider()
|
|
if interaction_target is InteractableBody:
|
|
interaction_target.interact(self)
|