aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--client/project.godot15
-rw-r--r--client/scenes/follow_camera.tscn7
-rw-r--r--client/scenes/game.tscn12
-rw-r--r--client/scripts/follow_camera.gd38
-rw-r--r--client/scripts/player.gd9
5 files changed, 75 insertions, 6 deletions
diff --git a/client/project.godot b/client/project.godot
index a473d236..9a608b93 100644
--- a/client/project.godot
+++ b/client/project.godot
@@ -41,3 +41,18 @@ right={
"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":68,"key_label":0,"unicode":100,"echo":false,"script":null)
]
}
+rotate_left={
+"deadzone": 0.5,
+"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":4194319,"key_label":0,"unicode":0,"echo":false,"script":null)
+]
+}
+rotate_right={
+"deadzone": 0.5,
+"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":4194321,"key_label":0,"unicode":0,"echo":false,"script":null)
+]
+}
+
+[rendering]
+
+anti_aliasing/quality/msaa_3d=2
+anti_aliasing/quality/use_taa=true
diff --git a/client/scenes/follow_camera.tscn b/client/scenes/follow_camera.tscn
new file mode 100644
index 00000000..816563ba
--- /dev/null
+++ b/client/scenes/follow_camera.tscn
@@ -0,0 +1,7 @@
+[gd_scene load_steps=2 format=3 uid="uid://b31mlnao6ybt8"]
+
+[ext_resource type="Script" path="res://scripts/follow_camera.gd" id="1_qipju"]
+
+[node name="FollowCamera" type="Camera3D"]
+fov = 45.0
+script = ExtResource("1_qipju")
diff --git a/client/scenes/game.tscn b/client/scenes/game.tscn
index 7448d395..bf93d4d7 100644
--- a/client/scenes/game.tscn
+++ b/client/scenes/game.tscn
@@ -1,7 +1,8 @@
-[gd_scene load_steps=6 format=3 uid="uid://clsylbmw7jc0s"]
+[gd_scene load_steps=7 format=3 uid="uid://clsylbmw7jc0s"]
[ext_resource type="PackedScene" uid="uid://bnqujofthaa4h" path="res://scenes/map.tscn" id="1_qt88a"]
[ext_resource type="PackedScene" uid="uid://d30bj2cp1m7gd" path="res://scenes/player.tscn" id="2_cdwnc"]
+[ext_resource type="PackedScene" uid="uid://b31mlnao6ybt8" path="res://scenes/follow_camera.tscn" id="3_6ot70"]
[sub_resource type="PhysicalSkyMaterial" id="PhysicalSkyMaterial_ko0bu"]
@@ -19,9 +20,6 @@ glow_enabled = true
[node name="Game" type="Node3D"]
-[node name="Camera3D" type="Camera3D" parent="."]
-transform = Transform3D(1, 0, 0, 0, 0.897643, 0.440723, 0, -0.440723, 0.897643, 0, 5.44153, 10.1162)
-
[node name="Map" parent="." instance=ExtResource("1_qt88a")]
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
@@ -31,6 +29,10 @@ shadow_enabled = true
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
environment = SubResource("Environment_h880f")
-[node name="Player" parent="." node_paths=PackedStringArray("map") instance=ExtResource("2_cdwnc")]
+[node name="Player" parent="." node_paths=PackedStringArray("map", "camera") instance=ExtResource("2_cdwnc")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 0, 2)
map = NodePath("../Map")
+camera = NodePath("../FollowCamera")
+
+[node name="FollowCamera" parent="." node_paths=PackedStringArray("target") instance=ExtResource("3_6ot70")]
+target = NodePath("../Player")
diff --git a/client/scripts/follow_camera.gd b/client/scripts/follow_camera.gd
new file mode 100644
index 00000000..b49bdc2b
--- /dev/null
+++ b/client/scripts/follow_camera.gd
@@ -0,0 +1,38 @@
+class_name FollowCamera
+extends Camera3D
+
+const ROTATE_SPEED: float = 1.5
+const ROTATE_WEIGHT: float = 8.0
+const LOOK_WEIGHT: float = 8.0
+const MOVE_WEIGHT: float = 2.0
+
+@export var target: Node3D
+
+var angle_target: float = 0
+var angle: float = 0
+var ground: Vector3
+
+func _ready():
+ if target == null:
+ push_warning("target is not set")
+ else:
+ ground = target.position
+
+func _process(delta):
+ if target != null:
+ follow(delta)
+
+func follow(delta):
+ var new_transform = transform.looking_at(target.position)
+
+ transform.basis = transform.basis.from_euler(Vector3(
+ lerp_angle(transform.basis.get_euler().x, new_transform.basis.get_euler().x, delta * LOOK_WEIGHT),
+ lerp_angle(transform.basis.get_euler().y, new_transform.basis.get_euler().y, delta * LOOK_WEIGHT),
+ lerp_angle(transform.basis.get_euler().z, new_transform.basis.get_euler().z, delta * LOOK_WEIGHT)
+ ))
+
+ angle_target += Input.get_axis("rotate_left", "rotate_right") * ROTATE_SPEED * delta
+ angle = lerp_angle(angle, angle_target, delta * ROTATE_WEIGHT)
+
+ ground = ground.lerp(target.position, delta * MOVE_WEIGHT)
+ position = ground + Vector3(0, 7.5, 7.5).rotated(Vector3.UP, angle)
diff --git a/client/scripts/player.gd b/client/scripts/player.gd
index 8296ebad..d574d70c 100644
--- a/client/scripts/player.gd
+++ b/client/scripts/player.gd
@@ -1,14 +1,17 @@
extends Node3D
const PLAYER_SIZE: float = 0.4
+const SPEED: float = 25.
@export var map: Node3D
+@export var camera: FollowCamera
var facing = Vector2(1, 0)
var velocity = Vector2(0, 0)
func _physics_process(delta):
var input = Vector2(Input.get_axis("left", "right"), Input.get_axis("forward", "backwards")).normalized()
+ input = input.rotated(-camera.angle_target)
if input.length() > 0.1:
facing = lerp_vector2_exp(facing, input, delta * 10.)
@@ -18,7 +21,11 @@ func _physics_process(delta):
velocity.x += input.x * delta * 0.5
velocity.y += input.y * delta * 0.5
- position = Vector3(position.x + velocity.x, 0, position.z + velocity.y)
+ position = Vector3(
+ position.x + (velocity.x * delta * SPEED),
+ 0,
+ position.z + (velocity.y * delta * SPEED)
+ )
# collide
collide(delta)