This commit is contained in:
bee
2026-07-07 10:01:56 +02:00
parent 2e28afebce
commit e946b43db7
13 changed files with 140 additions and 63 deletions
+20
View File
@@ -0,0 +1,20 @@
[gd_scene format=3 uid="uid://conoykdb1g38n"]
[ext_resource type="Script" uid="uid://b500yf6hema7c" path="res://scripts/stats_label.gd" id="1_37p78"]
[ext_resource type="Script" uid="uid://b3gsctxaxjaj1" path="res://scripts/hud.gd" id="1_64ctp"]
[node name="Hud" type="CanvasLayer" unique_id=167273188]
script = ExtResource("1_64ctp")
[node name="StatsLabel" type="Label" parent="." unique_id=1367070931]
unique_name_in_owner = true
anchors_preset = 3
anchor_left = 1.0
anchor_top = 1.0
anchor_right = 1.0
anchor_bottom = 1.0
offset_left = -76.0
offset_top = -52.0
grow_horizontal = 0
grow_vertical = 0
script = ExtResource("1_37p78")
+10 -56
View File
@@ -1,10 +1,9 @@
[gd_scene format=3 uid="uid://jven27ktracb"]
[ext_resource type="Material" uid="uid://6p5bg1nyso6d" path="res://materials/stylized_water.tres" id="1_water_material"]
[ext_resource type="Script" uid="uid://co5xetl8amg4j" path="res://scripts/ocean.gd" id="2_ocean_script"]
[ext_resource type="Script" uid="uid://c0n1x050jvspr" path="res://scripts/boat.gd" id="3_1bvp3"]
[ext_resource type="PackedScene" uid="uid://c6n3dg530t8oc" path="res://ocean.tscn" id="1_lquwl"]
[ext_resource type="PackedScene" uid="uid://cieiwihia8t2w" path="res://player_boat.tscn" id="2_7mycd"]
[ext_resource type="Script" uid="uid://46jiwugeccqg" path="res://scripts/camera_rig.gd" id="4_1bvp3"]
[ext_resource type="Script" uid="uid://b500yf6hema7c" path="res://scripts/stats_label.gd" id="5_lquwl"]
[ext_resource type="PackedScene" uid="uid://conoykdb1g38n" path="res://hud.tscn" id="4_272bh"]
[ext_resource type="Script" uid="uid://dpohf1tg5e2gs" path="res://scripts/world_manager.gd" id="6_7mycd"]
[sub_resource type="ProceduralSkyMaterial" id="SkyMaterial_1"]
@@ -19,11 +18,6 @@ background_mode = 2
sky = SubResource("Sky_1")
tonemap_mode = 2
[sub_resource type="PlaneMesh" id="PlaneMesh_ocean"]
size = Vector2(200, 200)
subdivide_width = 200
subdivide_depth = 200
[sub_resource type="BoxMesh" id="BoxMesh_seabed"]
size = Vector3(200, 1, 200)
@@ -33,14 +27,6 @@ albedo_color = Color(0.76, 0.7, 0.5, 1)
[sub_resource type="BoxShape3D" id="BoxShape_seabed"]
size = Vector3(200, 1, 200)
[sub_resource type="BoxMesh" id="BoxMesh_crate"]
[sub_resource type="StandardMaterial3D" id="Material_crate"]
albedo_color = Color(0.72, 0.53, 0.32, 1)
roughness = 0.9
[sub_resource type="BoxShape3D" id="BoxShape_crate"]
[node name="Main" type="Node3D" unique_id=1242452333]
[node name="WorldEnvironment" type="WorldEnvironment" parent="." unique_id=431656791]
@@ -50,13 +36,7 @@ environment = SubResource("Environment_1")
transform = Transform3D(1, 0, 0, 0, 0.642788, 0.766044, 0, -0.766044, 0.642788, 0, 20, 0)
shadow_enabled = true
[node name="Ocean" type="MeshInstance3D" parent="." unique_id=312504233 groups=["follow_focus", "ocean"]]
material_override = ExtResource("1_water_material")
mesh = SubResource("PlaneMesh_ocean")
script = ExtResource("2_ocean_script")
sea_height = 1.0
sea_choppy = 8.0
metadata/follow_step = 1.0
[node name="Ocean" parent="." unique_id=521355215 instance=ExtResource("1_lquwl")]
[node name="Seabed" type="StaticBody3D" parent="." unique_id=1919476025 groups=["follow_focus"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -4.5, 0)
@@ -68,50 +48,24 @@ surface_material_override/0 = SubResource("Material_seabed")
[node name="CollisionShape3D" type="CollisionShape3D" parent="Seabed" unique_id=111957760]
shape = SubResource("BoxShape_seabed")
[node name="Crate" type="RigidBody3D" parent="." unique_id=1409256205 groups=["shift_with_origin"]]
[node name="PlayerBoat" parent="." unique_id=1387061778 instance=ExtResource("2_7mycd")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3, 0)
mass = 5.0
script = ExtResource("3_1bvp3")
buoyancy = 1.5
full_force_depth = 0.8
probe_extents = Vector3(0.35, 0, 2.25)
[node name="Mesh" type="MeshInstance3D" parent="Crate" unique_id=1406951740]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0)
mesh = SubResource("BoxMesh_crate")
surface_material_override/0 = SubResource("Material_crate")
[node name="CollisionShape3D" type="CollisionShape3D" parent="Crate" unique_id=1190807384]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0)
shape = SubResource("BoxShape_crate")
[node name="CameraRig" type="Node3D" parent="." unique_id=2139913829 node_paths=PackedStringArray("target", "cam") groups=["shift_with_origin"]]
transform = Transform3D(1, 0, 0, 0, 0.9396926, 0.34202012, 0, -0.34202012, 0.9396926, 0, 0, 0)
script = ExtResource("4_1bvp3")
target = NodePath("../Crate")
target = NodePath("../PlayerBoat")
cam = NodePath("PlayerCamera")
[node name="PlayerCamera" type="Camera3D" parent="CameraRig" unique_id=553919400]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 8)
[node name="CanvasLayer" type="CanvasLayer" parent="." unique_id=1275537335]
[node name="StatsLabel" type="Label" parent="CanvasLayer" unique_id=15552030 node_paths=PackedStringArray("boat", "world")]
anchors_preset = 3
anchor_left = 1.0
anchor_top = 1.0
anchor_right = 1.0
anchor_bottom = 1.0
offset_left = -76.0
offset_top = -52.0
grow_horizontal = 0
grow_vertical = 0
script = ExtResource("5_lquwl")
boat = NodePath("../../Crate")
world = NodePath("../../WorldManager")
[node name="Hud" parent="." unique_id=167273188 node_paths=PackedStringArray("boat", "world") instance=ExtResource("4_272bh")]
boat = NodePath("../PlayerBoat")
world = NodePath("../WorldManager")
[node name="WorldManager" type="Node" parent="." unique_id=1879897241 node_paths=PackedStringArray("focus", "ocean")]
script = ExtResource("6_7mycd")
focus = NodePath("../Crate")
focus = NodePath("../PlayerBoat")
ocean = NodePath("../Ocean")
shift_threshold = 50.0
+17
View File
@@ -0,0 +1,17 @@
[gd_scene format=3 uid="uid://c6n3dg530t8oc"]
[ext_resource type="Material" uid="uid://6p5bg1nyso6d" path="res://materials/stylized_water.tres" id="1_j38dg"]
[ext_resource type="Script" uid="uid://co5xetl8amg4j" path="res://scripts/ocean.gd" id="2_nb2vx"]
[sub_resource type="PlaneMesh" id="PlaneMesh_ocean"]
size = Vector2(200, 200)
subdivide_width = 200
subdivide_depth = 200
[node name="Ocean" type="MeshInstance3D" unique_id=521355215 groups=["follow_focus", "ocean"]]
material_override = ExtResource("1_j38dg")
mesh = SubResource("PlaneMesh_ocean")
script = ExtResource("2_nb2vx")
sea_height = 1.0
sea_choppy = 8.0
metadata/follow_step = 1.0
+29
View File
@@ -0,0 +1,29 @@
[gd_scene format=3 uid="uid://cieiwihia8t2w"]
[ext_resource type="Script" uid="uid://c0n1x050jvspr" path="res://scripts/boat.gd" id="1_7h74f"]
[sub_resource type="BoxMesh" id="BoxMesh_crate"]
size = Vector3(1, 1, 5)
[sub_resource type="StandardMaterial3D" id="Material_crate"]
albedo_color = Color(0.72, 0.53, 0.32, 1)
roughness = 0.9
[sub_resource type="BoxShape3D" id="BoxShape_crate"]
[node name="PlayerBoat" type="RigidBody3D" unique_id=1387061778 groups=["shift_with_origin"]]
mass = 5.0
script = ExtResource("1_7h74f")
buoyancy = 1.5
full_force_depth = 0.8
probe_extents = Vector3(0.35, 0, 2.25)
probe_grid = Vector2i(2, 5)
[node name="Mesh" type="MeshInstance3D" parent="." unique_id=671943938]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0)
layers = 2
mesh = SubResource("BoxMesh_crate")
surface_material_override/0 = SubResource("Material_crate")
[node name="CollisionShape3D" type="CollisionShape3D" parent="." unique_id=18200711]
shape = SubResource("BoxShape_crate")
+19
View File
@@ -14,6 +14,10 @@ config/name="boatgame"
run/main_scene="res://main.tscn"
config/features=PackedStringArray("4.7", "Forward Plus")
[autoload]
Game="*uid://dtkqmj8h5mg8y"
[display]
window/stretch/mode="canvas_items"
@@ -46,11 +50,26 @@ throttle_stop={
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":88,"key_label":0,"unicode":120,"location":0,"echo":false,"script":null)
]
}
restart={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194332,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
[layer_names]
3d_physics/layer_1="terrain"
3d_physics/layer_2="player"
3d_physics/layer_3="enemies"
3d_physics/layer_4="projectiles"
3d_physics/layer_5="pickups"
[physics]
3d/physics_engine="Jolt Physics"
common/physics_interpolation=true
[rendering]
rendering_device/driver.windows="d3d12"
rendering_device/fallback_to_d3d12=false
+3 -3
View File
@@ -25,6 +25,9 @@ func _physics_process(delta: float) -> void:
throttle = move_toward(throttle, desired_throttle, throttle_response * delta)
if submerged_ratio <= 0.0:
return # airborne: no thrust, no rudder, no keel
# boat's forward direction, flattened onto the water plane
var forward := -global_basis.z
forward.y = 0.0
@@ -40,9 +43,6 @@ func _physics_process(delta: float) -> void:
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)
if submerged_ratio <= 0.0:
return # airborne: no thrust, no rudder, no keelffffff
# --- keel: kill sideways sliding ---
var right := global_basis.x
right.y = 0.0
-1
View File
@@ -57,7 +57,6 @@ func _physics_process(_delta: float) -> void:
var factor := clampf(depth / full_force_depth, 0.0, 1.0)
submerged_ratio += factor / _probe_offsets.size()
var force := Vector3.UP * _gravity * mass * buoyancy * factor / _probe_offsets.size()
apply_force(force, pos - global_position)
var r := pos - global_position
# velocity of this specific point on the hull (body motion + rotation)
var point_velocity := linear_velocity + angular_velocity.cross(r)
+6
View File
@@ -0,0 +1,6 @@
# scripts/game.gd — autoloaded as "Game"
extends Node
func _unhandled_input(event: InputEvent) -> void:
if event.is_action_pressed("restart"):
get_tree().reload_current_scene()
+1
View File
@@ -0,0 +1 @@
uid://dtkqmj8h5mg8y
+27
View File
@@ -0,0 +1,27 @@
class_name Hud
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:
set(value):
boat = value
if is_node_ready():
_distribute()
@export var world: WorldManager:
set(value):
world = value
if is_node_ready():
_distribute()
@onready var _stats_label: Label = %StatsLabel
func _ready() -> void:
_distribute()
func _distribute() -> void:
_stats_label.boat = boat
_stats_label.world = world
+1
View File
@@ -0,0 +1 @@
uid://b3gsctxaxjaj1
+3 -3
View File
@@ -5,7 +5,7 @@ extends Label
func _process(_delta: float) -> void:
if boat == null:
if boat == null or world == null:
text = "no boat"
return
@@ -22,6 +22,6 @@ Position: (%.0f, %.0f)
boat.throttle * 100.0,
speed,
boat.submerged_ratio * 100.0,
boat.global_position.x,
boat.global_position.z,
pos.x,
pos.z,
]
+4
View File
@@ -22,6 +22,8 @@ func true_position(node: Node3D) -> Vector3:
func _physics_process(_delta: float) -> void:
if focus == null:
return
_maybe_shift_origin()
_recenter_followers()
@@ -34,6 +36,7 @@ func _maybe_shift_origin() -> void:
origin_offset += shift
for node in get_tree().get_nodes_in_group("shift_with_origin"):
node.global_position -= shift
node.reset_physics_interpolation()
ocean.shift_origin(shift)
@@ -45,3 +48,4 @@ func _recenter_followers() -> void:
if new_x != node.global_position.x or new_z != node.global_position.z:
node.global_position.x = new_x
node.global_position.z = new_z
node.reset_physics_interpolation()