diff options
author | metamuffin <metamuffin@disroot.org> | 2024-07-03 16:54:53 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2024-07-03 16:54:53 +0200 |
commit | 074c37aae5b25844a9e85e89b30893042c9e6059 (patch) | |
tree | 62b0bd04cf5857f62f646a8d5c243e8ec7d3f8a1 | |
parent | e994feebe11e4c1d8b7f3825f2e1c9bbd2069e82 (diff) | |
download | hurrycurry-074c37aae5b25844a9e85e89b30893042c9e6059.tar hurrycurry-074c37aae5b25844a9e85e89b30893042c9e6059.tar.bz2 hurrycurry-074c37aae5b25844a9e85e89b30893042c9e6059.tar.zst |
correct interpolation (except angles)
-rw-r--r-- | client/game.gd | 2 | ||||
-rw-r--r-- | client/global.gd | 8 | ||||
-rw-r--r-- | client/map/items/item.gd | 2 | ||||
-rw-r--r-- | client/menu/overlay.gd | 6 | ||||
-rw-r--r-- | client/player/follow_camera.gd | 14 | ||||
-rw-r--r-- | client/player/player.gd | 4 |
6 files changed, 22 insertions, 14 deletions
diff --git a/client/game.gd b/client/game.gd index 3102c84d..98c8986b 100644 --- a/client/game.gd +++ b/client/game.gd @@ -204,7 +204,7 @@ func _ready(): mp.hide_score.connect($Overlay.hide) func _process(delta): - marker.position = lerp(marker.position, marker_target, delta * 40.0) + marker.position = Global.interpolate(marker.position, marker_target, delta * 30.) func get_tile_collision(pos: Vector2i) -> bool: var t = map.get_tile_name(pos) diff --git a/client/global.gd b/client/global.gd index 042752cc..2dd5f735 100644 --- a/client/global.gd +++ b/client/global.gd @@ -155,3 +155,11 @@ func set_setting(key: String, value): push_error("Tried to set setting \"%s\", which does not yet exist (missing key)" % key) return settings[key].set_value(value) + +func interpolate(current, target, dt): + return target + (current - target) * exp(-dt) + +func interpolate_angle(current, target, dt): + if abs(target - current) > PI: + target -= PI * 2 + return target + (current - target) * exp(-dt) diff --git a/client/map/items/item.gd b/client/map/items/item.gd index fb55b230..84d3f3fa 100644 --- a/client/map/items/item.gd +++ b/client/map/items/item.gd @@ -40,7 +40,7 @@ func _ready(): position = owned_by.global_position func _process(delta): - position = lerp(position, owned_by.global_position, delta * 30.0) + position = Global.interpolate(position, owned_by.global_position, delta * 30.0) func progress(p: float, warn: bool): progress_instance.visible = true diff --git a/client/menu/overlay.gd b/client/menu/overlay.gd index 89bbeb24..58e1415c 100644 --- a/client/menu/overlay.gd +++ b/client/menu/overlay.gd @@ -34,9 +34,9 @@ func update(failed_: int, completed_: int, points_: int, time: float): timer.start() func _process(delta): - failed_label.scale = lerp(failed_label.scale, Vector2(1, 1), delta * 4.) - completed_label.scale = lerp(completed_label.scale, Vector2(1, 1), delta * 4.) - points_label.scale = lerp(points_label.scale, Vector2(1, 1), delta * 4.) + failed_label.scale = Global.interpolate(failed_label.scale, Vector2(1, 1), delta * 4.) + completed_label.scale = Global.interpolate(completed_label.scale, Vector2(1, 1), delta * 4.) + points_label.scale = Global.interpolate(points_label.scale, Vector2(1, 1), delta * 4.) var seconds: float = floor(timer.time_left) seconds_label.text = str(int(seconds)) decimals_label.text = "%01d" % int((timer.time_left - seconds) * 10) diff --git a/client/player/follow_camera.gd b/client/player/follow_camera.gd index 19ecc65a..db939a0b 100644 --- a/client/player/follow_camera.gd +++ b/client/player/follow_camera.gd @@ -60,13 +60,13 @@ func follow(delta): angle_target += Input.get_axis("rotate_left", "rotate_right") * ( ROTATE_SPEED * delta * (-1 if Global.get_setting("invert_camera") else 1) ) - angle = lerp_angle(angle, angle_target, delta * ROTATE_WEIGHT) + angle = Global.interpolate_angle(angle, angle_target, delta * ROTATE_WEIGHT) angle_up_target += Input.get_axis("rotate_down", "rotate_up") * ( ROTATE_UP_SPEED * delta * (-1 if Global.get_setting("invert_camera") else 1) ) 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) + angle_up = Global.interpolate_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) @@ -76,17 +76,17 @@ func follow(delta): if Global.get_setting("interpolate_camera_rotation"): 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) + Global.interpolate_angle(transform.basis.get_euler().x, new_transform.basis.get_euler().x, delta * LOOK_WEIGHT), + Global.interpolate_angle(transform.basis.get_euler().y, new_transform.basis.get_euler().y, delta * LOOK_WEIGHT), + Global.interpolate_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) + ground = Global.interpolate(ground, target.position, delta * MOVE_WEIGHT) 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) + camera_distance = Global.interpolate(camera_distance, camera_distance_target, delta * ZOOM_WEIGHT) position = ground + offset diff --git a/client/player/player.gd b/client/player/player.gd index 301f7945..ef977ce6 100644 --- a/client/player/player.gd +++ b/client/player/player.gd @@ -116,8 +116,8 @@ func pass_to(player: Player): func _process(delta): _anim_angle = fmod(_anim_angle + delta, TAU) hand_base.position.y = HAND_BASE_POSITION.y + 0.05 * sin(_anim_angle * 3) - position_anim = lerp(position_anim, position_, delta * 10) - rotation_anim = lerp_angle(rotation_anim, rotation_, delta * 10) + position_anim = Global.interpolate(position_anim, position_, delta * 10) + rotation_anim = Global.interpolate_angle(rotation_anim, rotation_, delta * 10) position.x = position_anim.x position.z = position_anim.y rotation.y = rotation_anim |