2025-03-25 10:49:02 +00:00
|
|
|
@icon("uid://3ugrjpybrl4e")
|
2025-03-24 17:01:51 +00:00
|
|
|
extends RigidBody3D
|
|
|
|
class_name Boat
|
2025-03-24 15:01:39 +00:00
|
|
|
|
2025-03-25 17:23:14 +00:00
|
|
|
@export var max_thrust_force: float = 2048*3.0
|
|
|
|
@export var max_steering: float = 50.0
|
2025-03-24 15:01:39 +00:00
|
|
|
|
2025-03-25 17:23:14 +00:00
|
|
|
var steering: float = 0 # steering rudder angle in radians
|
|
|
|
var thrust_force: float = 0 # forward thrust force in Newtons
|
|
|
|
var cam_rotation:Vector3
|
2025-03-25 10:49:02 +00:00
|
|
|
|
2025-03-25 17:23:14 +00:00
|
|
|
var is_docked: bool = false
|
|
|
|
var submerged := false
|
2025-03-25 10:49:02 +00:00
|
|
|
|
2025-03-25 17:23:14 +00:00
|
|
|
func _ready():
|
|
|
|
add_to_group("boats",true)
|
2025-03-24 15:01:39 +00:00
|
|
|
|
|
|
|
|
2025-03-25 17:23:14 +00:00
|
|
|
|
|
|
|
func _physics_process(delta):
|
|
|
|
## Code for user-input movement
|
|
|
|
if thrust_force >0.0:
|
|
|
|
apply_central_force(self.global_transform.basis.x.normalized() * Vector3(1, 0, 1) * thrust_force * delta)
|
|
|
|
#apply_torque(Vector3.UP * steering * delta)
|
|
|
|
apply_torque(global_transform.basis.y.normalized() * steering ) # for sideways motion
|
|
|
|
reset_forces()
|
|
|
|
|
|
|
|
func _process(_delta):
|
|
|
|
if Input.get_action_strength("move_forward") > 0.0:
|
|
|
|
thrust()
|
|
|
|
if Input.get_action_strength("turn_right") > 0.0:
|
|
|
|
steer_right()
|
|
|
|
if Input.get_action_strength("turn_left") > 0.0:
|
|
|
|
steer_left()
|
|
|
|
if Input.get_action_strength("camera_left") > 0.0:
|
|
|
|
cam_rotation += Vector3(0.0,1.0,0.0)*_delta
|
|
|
|
if Input.get_action_strength("camera_right") > 0.0:
|
|
|
|
cam_rotation += Vector3(0.0,-1.0,0.0)*_delta
|
|
|
|
|
|
|
|
func thrust(_strength:=1.0):
|
|
|
|
if not is_docked:
|
|
|
|
thrust_force = max_thrust_force
|
|
|
|
|
|
|
|
func steer_right(_strength:=1.0):
|
|
|
|
if not is_docked:
|
|
|
|
steering = -PI * max_steering
|
|
|
|
|
|
|
|
func steer_left(_strength:=1.0):
|
|
|
|
if not is_docked:
|
|
|
|
steering = PI * max_steering
|
|
|
|
|
|
|
|
|
|
|
|
func reset_forces():
|
|
|
|
thrust_force = 0
|
|
|
|
steering = 0
|