player controller logic

This commit is contained in:
bee
2026-07-07 11:53:39 +02:00
parent b4f6dda29b
commit a40d0bfdd3
10 changed files with 93 additions and 25 deletions
+3 -12
View File
@@ -1,27 +1,19 @@
class_name Boat
extends FloatingBody
## All force values are per-kilogram (they get multiplied by mass), so the
## boat handles the same if you change its mass later.
## All values multiplied by mass, handling the same regardless of it
@export var engine_power := 12.0 # forward thrust, m/s² at full throttle
@export var reverse_ratio := 0.4 # reverse is weaker, like a real prop
@export var throttle_response := 1.5 # how fast the engine spools up/down
@export var rudder_strength := 2.5 # turning torque at speed
@export var keel_grip := 3.0 # resistance to sliding sideways
var desired_throttle := 0.0
var desired_throttle := 0.0 # move_toward target for actual throttle
var steer_input := 0.0
var throttle := 0.0
func _physics_process(delta: float) -> void:
super(delta)
if Input.is_action_pressed("throttle_increase"):
desired_throttle = move_toward(desired_throttle, 1, 0.005)
elif Input.is_action_pressed("throttle_decrease"):
desired_throttle = move_toward(desired_throttle, -1, 0.006)
elif Input.is_action_pressed("throttle_stop"):
desired_throttle = 0.0
throttle = move_toward(throttle, desired_throttle, throttle_response * delta)
@@ -38,7 +30,6 @@ func _physics_process(delta: float) -> void:
apply_central_force(forward * throttle * power * mass * submerged_ratio)
# --- rudder: only bites when water flows past it ---
var steer_input := Input.get_axis("rudder_right", "rudder_left")
var forward_speed := linear_velocity.dot(forward)
var rudder_bite := clampf(forward_speed / 3.0, -1.0, 1.0)
apply_torque(Vector3.UP * steer_input * rudder_strength * rudder_bite * mass * submerged_ratio)
+3 -1
View File
@@ -1,10 +1,12 @@
class_name CameraRig
extends Node3D
@export var target: Node3D
@export var sensitivity := 0.005
@export var follow_speed := 5.0
@export var cam: Camera3D
var target: Node3D # Controlled by PlayerController
var _dragging := false
+2 -1
View File
@@ -4,11 +4,12 @@ extends CanvasLayer
## The HUD's only inputs. Everything inside hud.tscn gets its references
## from here -- nothing inside the scene reaches out on its own.
@export var boat: Boat:
var boat: Boat: # Controlled by PlayerController TODO: Testing values, different label for different types
set(value):
boat = value
if is_node_ready():
_distribute()
@export var world: WorldManager:
set(value):
world = value
+58
View File
@@ -0,0 +1,58 @@
class_name PlayerController
extends Node
@export var current_controlled : Boat:
set(value):
current_controlled = value
if is_node_ready():
if current_controlled != null:
desired_throttle = current_controlled.throttle
_possess()
@export var world_manager : WorldManager:
set(value):
world_manager = value
if is_node_ready():
_possess()
@export var camera_rig : CameraRig:
set(value):
camera_rig = value
if is_node_ready():
_possess()
@export var hud : Hud:
set(value):
hud = value
if is_node_ready():
_possess()
@export var throttle_ramp := 0.5
var desired_throttle := 0.0
func _ready() -> void:
if current_controlled != null: # Only happens on intial loading if boat already moves
desired_throttle = current_controlled.throttle
_possess()
func _process(delta: float) -> void:
if current_controlled == null:
return
if Input.is_action_pressed("throttle_increase"):
desired_throttle = move_toward(desired_throttle, 1, throttle_ramp * delta)
elif Input.is_action_pressed("throttle_decrease"):
desired_throttle = move_toward(desired_throttle, -1, throttle_ramp * delta)
elif Input.is_action_pressed("throttle_stop"):
desired_throttle = 0.0
var steer_input := Input.get_axis("rudder_right", "rudder_left")
current_controlled.desired_throttle = desired_throttle
current_controlled.steer_input = steer_input
func _possess() -> void:
camera_rig.target = current_controlled
world_manager.focus = current_controlled
hud.boat = current_controlled
+1
View File
@@ -0,0 +1 @@
uid://bxk0exu40a25x
+3 -1
View File
@@ -14,11 +14,13 @@ func _process(_delta: float) -> void:
var speed := boat.linear_velocity.dot(forward.normalized())
var pos := world.true_position(boat)
text = "Throttle: %+.0f %%
text = "Desired Throttle: %+.0f %%
Actual Throttle: %+.0f %%
Speed: %.1f m/s
Submerged: %.0f %%
Position: (%.0f, %.0f)
" % [
boat.desired_throttle * 100.0,
boat.throttle * 100.0,
speed,
boat.submerged_ratio * 100.0,
+2 -1
View File
@@ -5,7 +5,6 @@ extends Node
## recenters scenery in the follow_focus group, and shifts the origin
## (teleporting the shift_with_origin group) before float precision degrades.
@export var focus: Node3D # the boat
@export var ocean: Ocean
## Distance from origin that triggers an origin shift.
@export var shift_threshold := 2048.0
@@ -16,6 +15,8 @@ extends Node
## True world position of the current local origin (grows over a long voyage).
var origin_offset := Vector3.ZERO
var focus: Node3D # Controlled by PlayerController
func true_position(node: Node3D) -> Vector3:
return node.global_position + origin_offset