stuff
This commit is contained in:
@@ -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")
|
||||||
@@ -1,10 +1,9 @@
|
|||||||
[gd_scene format=3 uid="uid://jven27ktracb"]
|
[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="PackedScene" uid="uid://c6n3dg530t8oc" path="res://ocean.tscn" id="1_lquwl"]
|
||||||
[ext_resource type="Script" uid="uid://co5xetl8amg4j" path="res://scripts/ocean.gd" id="2_ocean_script"]
|
[ext_resource type="PackedScene" uid="uid://cieiwihia8t2w" path="res://player_boat.tscn" id="2_7mycd"]
|
||||||
[ext_resource type="Script" uid="uid://c0n1x050jvspr" path="res://scripts/boat.gd" id="3_1bvp3"]
|
|
||||||
[ext_resource type="Script" uid="uid://46jiwugeccqg" path="res://scripts/camera_rig.gd" id="4_1bvp3"]
|
[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"]
|
[ext_resource type="Script" uid="uid://dpohf1tg5e2gs" path="res://scripts/world_manager.gd" id="6_7mycd"]
|
||||||
|
|
||||||
[sub_resource type="ProceduralSkyMaterial" id="SkyMaterial_1"]
|
[sub_resource type="ProceduralSkyMaterial" id="SkyMaterial_1"]
|
||||||
@@ -19,11 +18,6 @@ background_mode = 2
|
|||||||
sky = SubResource("Sky_1")
|
sky = SubResource("Sky_1")
|
||||||
tonemap_mode = 2
|
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"]
|
[sub_resource type="BoxMesh" id="BoxMesh_seabed"]
|
||||||
size = Vector3(200, 1, 200)
|
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"]
|
[sub_resource type="BoxShape3D" id="BoxShape_seabed"]
|
||||||
size = Vector3(200, 1, 200)
|
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="Main" type="Node3D" unique_id=1242452333]
|
||||||
|
|
||||||
[node name="WorldEnvironment" type="WorldEnvironment" parent="." unique_id=431656791]
|
[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)
|
transform = Transform3D(1, 0, 0, 0, 0.642788, 0.766044, 0, -0.766044, 0.642788, 0, 20, 0)
|
||||||
shadow_enabled = true
|
shadow_enabled = true
|
||||||
|
|
||||||
[node name="Ocean" type="MeshInstance3D" parent="." unique_id=312504233 groups=["follow_focus", "ocean"]]
|
[node name="Ocean" parent="." unique_id=521355215 instance=ExtResource("1_lquwl")]
|
||||||
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="Seabed" type="StaticBody3D" parent="." unique_id=1919476025 groups=["follow_focus"]]
|
[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)
|
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]
|
[node name="CollisionShape3D" type="CollisionShape3D" parent="Seabed" unique_id=111957760]
|
||||||
shape = SubResource("BoxShape_seabed")
|
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)
|
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"]]
|
[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)
|
transform = Transform3D(1, 0, 0, 0, 0.9396926, 0.34202012, 0, -0.34202012, 0.9396926, 0, 0, 0)
|
||||||
script = ExtResource("4_1bvp3")
|
script = ExtResource("4_1bvp3")
|
||||||
target = NodePath("../Crate")
|
target = NodePath("../PlayerBoat")
|
||||||
cam = NodePath("PlayerCamera")
|
cam = NodePath("PlayerCamera")
|
||||||
|
|
||||||
[node name="PlayerCamera" type="Camera3D" parent="CameraRig" unique_id=553919400]
|
[node name="PlayerCamera" type="Camera3D" parent="CameraRig" unique_id=553919400]
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 8)
|
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="Hud" parent="." unique_id=167273188 node_paths=PackedStringArray("boat", "world") instance=ExtResource("4_272bh")]
|
||||||
|
boat = NodePath("../PlayerBoat")
|
||||||
[node name="StatsLabel" type="Label" parent="CanvasLayer" unique_id=15552030 node_paths=PackedStringArray("boat", "world")]
|
world = NodePath("../WorldManager")
|
||||||
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="WorldManager" type="Node" parent="." unique_id=1879897241 node_paths=PackedStringArray("focus", "ocean")]
|
[node name="WorldManager" type="Node" parent="." unique_id=1879897241 node_paths=PackedStringArray("focus", "ocean")]
|
||||||
script = ExtResource("6_7mycd")
|
script = ExtResource("6_7mycd")
|
||||||
focus = NodePath("../Crate")
|
focus = NodePath("../PlayerBoat")
|
||||||
ocean = NodePath("../Ocean")
|
ocean = NodePath("../Ocean")
|
||||||
shift_threshold = 50.0
|
shift_threshold = 50.0
|
||||||
|
|||||||
+17
@@ -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
|
||||||
@@ -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")
|
||||||
@@ -14,6 +14,10 @@ config/name="boatgame"
|
|||||||
run/main_scene="res://main.tscn"
|
run/main_scene="res://main.tscn"
|
||||||
config/features=PackedStringArray("4.7", "Forward Plus")
|
config/features=PackedStringArray("4.7", "Forward Plus")
|
||||||
|
|
||||||
|
[autoload]
|
||||||
|
|
||||||
|
Game="*uid://dtkqmj8h5mg8y"
|
||||||
|
|
||||||
[display]
|
[display]
|
||||||
|
|
||||||
window/stretch/mode="canvas_items"
|
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)
|
"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]
|
[physics]
|
||||||
|
|
||||||
3d/physics_engine="Jolt Physics"
|
3d/physics_engine="Jolt Physics"
|
||||||
|
common/physics_interpolation=true
|
||||||
|
|
||||||
[rendering]
|
[rendering]
|
||||||
|
|
||||||
rendering_device/driver.windows="d3d12"
|
rendering_device/driver.windows="d3d12"
|
||||||
|
rendering_device/fallback_to_d3d12=false
|
||||||
|
|||||||
+3
-3
@@ -25,6 +25,9 @@ func _physics_process(delta: float) -> void:
|
|||||||
|
|
||||||
throttle = move_toward(throttle, desired_throttle, throttle_response * delta)
|
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
|
# boat's forward direction, flattened onto the water plane
|
||||||
var forward := -global_basis.z
|
var forward := -global_basis.z
|
||||||
forward.y = 0.0
|
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)
|
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)
|
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 ---
|
# --- keel: kill sideways sliding ---
|
||||||
var right := global_basis.x
|
var right := global_basis.x
|
||||||
right.y = 0.0
|
right.y = 0.0
|
||||||
|
|||||||
@@ -57,7 +57,6 @@ func _physics_process(_delta: float) -> void:
|
|||||||
var factor := clampf(depth / full_force_depth, 0.0, 1.0)
|
var factor := clampf(depth / full_force_depth, 0.0, 1.0)
|
||||||
submerged_ratio += factor / _probe_offsets.size()
|
submerged_ratio += factor / _probe_offsets.size()
|
||||||
var force := Vector3.UP * _gravity * mass * buoyancy * 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
|
var r := pos - global_position
|
||||||
# velocity of this specific point on the hull (body motion + rotation)
|
# velocity of this specific point on the hull (body motion + rotation)
|
||||||
var point_velocity := linear_velocity + angular_velocity.cross(r)
|
var point_velocity := linear_velocity + angular_velocity.cross(r)
|
||||||
|
|||||||
@@ -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()
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
uid://dtkqmj8h5mg8y
|
||||||
@@ -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
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
uid://b3gsctxaxjaj1
|
||||||
@@ -5,7 +5,7 @@ extends Label
|
|||||||
|
|
||||||
|
|
||||||
func _process(_delta: float) -> void:
|
func _process(_delta: float) -> void:
|
||||||
if boat == null:
|
if boat == null or world == null:
|
||||||
text = "no boat"
|
text = "no boat"
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -22,6 +22,6 @@ Position: (%.0f, %.0f)
|
|||||||
boat.throttle * 100.0,
|
boat.throttle * 100.0,
|
||||||
speed,
|
speed,
|
||||||
boat.submerged_ratio * 100.0,
|
boat.submerged_ratio * 100.0,
|
||||||
boat.global_position.x,
|
pos.x,
|
||||||
boat.global_position.z,
|
pos.z,
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -22,6 +22,8 @@ func true_position(node: Node3D) -> Vector3:
|
|||||||
|
|
||||||
|
|
||||||
func _physics_process(_delta: float) -> void:
|
func _physics_process(_delta: float) -> void:
|
||||||
|
if focus == null:
|
||||||
|
return
|
||||||
_maybe_shift_origin()
|
_maybe_shift_origin()
|
||||||
_recenter_followers()
|
_recenter_followers()
|
||||||
|
|
||||||
@@ -34,6 +36,7 @@ func _maybe_shift_origin() -> void:
|
|||||||
origin_offset += shift
|
origin_offset += shift
|
||||||
for node in get_tree().get_nodes_in_group("shift_with_origin"):
|
for node in get_tree().get_nodes_in_group("shift_with_origin"):
|
||||||
node.global_position -= shift
|
node.global_position -= shift
|
||||||
|
node.reset_physics_interpolation()
|
||||||
ocean.shift_origin(shift)
|
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:
|
if new_x != node.global_position.x or new_z != node.global_position.z:
|
||||||
node.global_position.x = new_x
|
node.global_position.x = new_x
|
||||||
node.global_position.z = new_z
|
node.global_position.z = new_z
|
||||||
|
node.reset_physics_interpolation()
|
||||||
|
|||||||
Reference in New Issue
Block a user