diff options
author | nokoe <nokoe@mailbox.org> | 2024-06-26 23:28:07 +0200 |
---|---|---|
committer | nokoe <nokoe@mailbox.org> | 2024-06-26 23:28:52 +0200 |
commit | ec4e2769ee7148cbc0afa329f5fe5922051abba8 (patch) | |
tree | 7bbdfe1cefa0695daeb51ada8527c1bcd03aeafd | |
parent | 8784d1a619f4224a4fe659750c91561fcc733100 (diff) | |
download | hurrycurry-ec4e2769ee7148cbc0afa329f5fe5922051abba8.tar hurrycurry-ec4e2769ee7148cbc0afa329f5fe5922051abba8.tar.bz2 hurrycurry-ec4e2769ee7148cbc0afa329f5fe5922051abba8.tar.zst |
add zoom, improve camera
-rw-r--r-- | client/map/items/burned.gd | 8 | ||||
-rw-r--r-- | client/map/items/burned_pot.gd | 4 | ||||
-rw-r--r-- | client/player/follow_camera.gd | 45 | ||||
-rw-r--r-- | client/project.godot | 12 |
4 files changed, 52 insertions, 17 deletions
diff --git a/client/map/items/burned.gd b/client/map/items/burned.gd index 5c98817a..ad7b4505 100644 --- a/client/map/items/burned.gd +++ b/client/map/items/burned.gd @@ -16,13 +16,17 @@ class_name Burned extends Item +var steam: CPUParticles3D = load("res://map/items/steam.tscn").instantiate() + func _init(owned_by_: Node3D): super(owned_by_) - var steam: CPUParticles3D = load("res://map/items/steam.tscn").instantiate() - steam.emitting = true steam.color = Color(0., 0., 0.) add_child(load("res://map/items/burned.tscn").instantiate()) base.add_child(steam) + +func _ready(): + steam.emitting = true + static func base_position() -> Vector3: return Vector3(0., .2, 0.) diff --git a/client/map/items/burned_pot.gd b/client/map/items/burned_pot.gd index dc749259..d38cae6e 100644 --- a/client/map/items/burned_pot.gd +++ b/client/map/items/burned_pot.gd @@ -18,6 +18,8 @@ extends PotFill func _init(owned_by_: Node3D): super(owned_by_) - steam.emitting = true steam.color = Color(0., 0., 0.) set_color(Color(.1, .1, .1)) + +func _ready(): + steam.emitting = true diff --git a/client/player/follow_camera.gd b/client/player/follow_camera.gd index 74355688..f0d5700d 100644 --- a/client/player/follow_camera.gd +++ b/client/player/follow_camera.gd @@ -1,19 +1,19 @@ # Undercooked - a game about cooking # Copyright 2024 nokoe # Copyright 2024 metamuffin -# +# # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, version 3 of the License only. -# +# # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. -# +# # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see <https://www.gnu.org/licenses/>. -# +# class_name FollowCamera extends Camera3D @@ -25,7 +25,10 @@ const ANGLE_UP_MIN: float = 0.5 const ANGLE_UP_MAX: float = 1.2 const LOOK_WEIGHT: float = 8.0 const MOVE_WEIGHT: float = 2.0 -const CAMERA_DISTANCE: float = 10 +const ZOOM_SPEED: float = 10.0 +const ZOOM_WEIGHT: float = 10.0 +const MAX_ZOOM: float = 20.0 +const MIN_ZOOM: float = 2.0 @export var target: Node3D @@ -34,6 +37,8 @@ var angle: float = 0 var angle_up_target: float = 1 var angle_up: float = 1 var ground: Vector3 +var camera_distance: float = 10. +var camera_distance_target: float = camera_distance func _ready(): if target == null: @@ -46,14 +51,6 @@ func _process(delta): follow(delta) func follow(delta): - var new_transform = transform.looking_at(target.position) - - transform.basis = 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) @@ -61,5 +58,25 @@ func follow(delta): angle_up_target = clamp(angle_up_target, ANGLE_UP_MIN, ANGLE_UP_MAX) angle_up = lerp_angle(angle_up, angle_up_target, delta * ROTATE_UP_WEIGHT) + var offset = Vector3(0, sin(angle_up) * camera_distance, cos(angle_up) * camera_distance).rotated(Vector3.UP, angle) + + var new_transform = transform + new_transform.origin = target.position + offset + new_transform = new_transform.looking_at(target.position) + + if Global.settings["interpolate_camera_rotation"]["value"]: + transform.basis = 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) + )) + else: + transform.basis = new_transform.basis ground = ground.lerp(target.position, delta * MOVE_WEIGHT) - position = ground + Vector3(0, sin(angle_up) * CAMERA_DISTANCE, cos(angle_up) * CAMERA_DISTANCE).rotated(Vector3.UP, angle) + + camera_distance_target += Input.get_axis("zoom_in", "zoom_out") * ZOOM_SPEED * delta + camera_distance_target = clamp(camera_distance_target, MIN_ZOOM, MAX_ZOOM) + + camera_distance = lerp(camera_distance, camera_distance_target, delta * ZOOM_WEIGHT) + + position = ground + offset diff --git a/client/project.godot b/client/project.godot index 23b423fe..e2d5da31 100644 --- a/client/project.godot +++ b/client/project.godot @@ -103,6 +103,18 @@ boost={ , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":1,"pressure":0.0,"pressed":false,"script":null) ] } +zoom_in={ +"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":4194323,"key_label":0,"unicode":0,"echo":false,"script":null) +, 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":4194437,"key_label":0,"unicode":43,"echo":false,"script":null) +] +} +zoom_out={ +"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":4194324,"key_label":0,"unicode":0,"echo":false,"script":null) +, 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":4194435,"key_label":0,"unicode":45,"echo":false,"script":null) +] +} [internationalization] |