diff options
-rw-r--r-- | client/project.godot | 15 | ||||
-rw-r--r-- | client/scenes/follow_camera.tscn | 7 | ||||
-rw-r--r-- | client/scenes/game.tscn | 12 | ||||
-rw-r--r-- | client/scripts/follow_camera.gd | 38 | ||||
-rw-r--r-- | client/scripts/player.gd | 9 |
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) |