wayfarers_wanderer/player.gd
Jonas Reith fa38e603a1 Initial commit: WayfarersWanderer project state
Godot 4.6 exploration game with player movement, step-rotation camera
rig, and POI interaction system (explore/rest/close menu). main.tscn
is a test scene with placeholder props; debug/ holds unwired terrain
prototypes (voxel river, procedural island mesh, cross-shaped hub
2026-08-26 19:05:30 +02:00

63 lines
1.5 KiB
GDScript
Executable File

extends CharacterBody3D
@export var move_speed: float = 5.0
@export var gravity: float = 9.8
var camera_rig: Node3D
@onready var sprite: AnimatedSprite3D = $AnimatedSprite3D
func _ready() -> void:
camera_rig = get_tree().get_first_node_in_group("camera_rig")
if camera_rig == null:
push_error("CameraRig nicht gefunden! Gruppe 'camera_rig' gesetzt?")
func _physics_process(delta: float) -> void:
# Bewegung sperren während Interaction
if InteractionManager.active:
velocity = Vector3.ZERO
return
# Schwerkraft
if not is_on_floor():
velocity.y -= gravity * delta
# Eingabe
var input_dir = Vector2(
Input.get_axis("move_left", "move_right"),
Input.get_axis("move_forward", "move_backward")
)
if input_dir != Vector2.ZERO:
var cam_basis = camera_rig.global_transform.basis
var forward = -cam_basis.z
var right = cam_basis.x
forward.y = 0
right.y = 0
forward = forward.normalized()
right = right.normalized()
var move_dir = (forward * -input_dir.y + right * input_dir.x).normalized()
velocity.x = move_dir.x * move_speed
velocity.z = move_dir.z * move_speed
_update_animation(input_dir)
else:
velocity.x = move_toward(velocity.x, 0, move_speed)
velocity.z = move_toward(velocity.z, 0, move_speed)
sprite.play("idle")
move_and_slide()
func _update_animation(input_dir: Vector2) -> void:
if input_dir.y > 0.1:
sprite.play("move_down")
elif input_dir.y < -0.1:
sprite.play("move_up")
elif input_dir.x > 0.1:
sprite.play("move_right")
elif input_dir.x < -0.1:
sprite.play("move_left")
else:
sprite.play("idle")