diff options
| author | metamuffin <metamuffin@disroot.org> | 2025-10-10 01:43:46 +0200 |
|---|---|---|
| committer | metamuffin <metamuffin@disroot.org> | 2025-10-10 01:43:48 +0200 |
| commit | f837968a63764b1fe2edda442e5f73da2cf203d7 (patch) | |
| tree | 9727762c34691202068d897aef7c5d2659469acf | |
| parent | e3eaf0bd831a5d2152abd272ec8cf62c2ceac2a4 (diff) | |
| download | hurrycurry-f837968a63764b1fe2edda442e5f73da2cf203d7.tar hurrycurry-f837968a63764b1fe2edda442e5f73da2cf203d7.tar.bz2 hurrycurry-f837968a63764b1fe2edda442e5f73da2cf203d7.tar.zst | |
reset camera game starts to avoid sliding in from (0,0); slight FollowCamera refactor
| -rw-r--r-- | client/game.gd | 14 | ||||
| -rw-r--r-- | client/player/follow_camera.gd | 27 |
2 files changed, 25 insertions, 16 deletions
diff --git a/client/game.gd b/client/game.gd index b2d16f56..50230f93 100644 --- a/client/game.gd +++ b/client/game.gd @@ -298,6 +298,7 @@ func handle_packet(p): follow_camera.set_ingame(p.state, p.lobby) if p.state: + reset_camera() map.gi_bake() await get_parent()._menu_open() map.autobake = true @@ -450,6 +451,13 @@ func get_tile_interactive(pos: Vector2i, hands: Array) -> bool: if item_index_by_name[hand.item_name] in tile_placeable_items[tile]: return true return false +func reset_camera(): + var extents = map.extents() + var map_center = ((extents[0] + extents[1]) / 2) + Vector2(.5, .5) + $FollowCamera.reset() + $Center.position = Vector3(map_center.x, 0., map_center.y) + $FollowCamera.jump_to_target() + $FollowCamera.camera_distance = 20. func update_center(): $FollowCamera.autozoom = spectating_mode == SpectatingMode.CENTER and join_state == JoinState.SPECTATING @@ -464,10 +472,8 @@ func update_center(): elif spectating_mode == SpectatingMode.FREE and Input.is_action_just_pressed("reset"): spectating_mode = SpectatingMode.CENTER match spectating_mode: - SpectatingMode.CENTER: - spectate_center() - SpectatingMode.FREE: - spectate_free() + SpectatingMode.CENTER: spectate_center() + SpectatingMode.FREE: spectate_free() func spectate_center(): var any_chefs = false diff --git a/client/player/follow_camera.gd b/client/player/follow_camera.gd index 42670118..60b7cc6d 100644 --- a/client/player/follow_camera.gd +++ b/client/player/follow_camera.gd @@ -56,6 +56,7 @@ func _ready(): func _process(delta): if target != null: + handle_input(delta) follow(delta) func _input(event): @@ -74,6 +75,20 @@ func zoom(zoom_dist: float) -> void: camera_distance_target *= exp(zoom_dist * ZOOM_SPEED) camera_distance_target = clamp(camera_distance_target, MIN_ZOOM, MAX_ZOOM) +func handle_input(delta): + if _disable_input: return + var invert_factor = -1 if Settings.read("gameplay.invert_camera") else 1; + angle_target += Input.get_axis("rotate_left", "rotate_right") * ROTATE_SPEED * delta * invert_factor + angle_up_target += Input.get_axis("rotate_down", "rotate_up") * ROTATE_UP_SPEED * delta * invert_factor + + var zoom_dist = Input.get_axis("zoom_in", "zoom_out") * delta + zoom_dist += float(Input.is_action_just_pressed("zoom_out_discrete")) * DISCRETE_DURATION + zoom_dist -= float(Input.is_action_just_pressed("zoom_in_discrete")) * DISCRETE_DURATION + zoom(zoom_dist) + +func jump_to_target(): + follow(INF) + func follow(delta): if Settings.read("gameplay.first_person"): var player = target.get_parent() @@ -86,15 +101,9 @@ func follow(delta): target.get_parent().input_rotation = -rotation.y return else: fov = 45. - - var invert_factor = -1 if Settings.read("gameplay.invert_camera") else 1; - if not _disable_input: - angle_target += Input.get_axis("rotate_left", "rotate_right") * ROTATE_SPEED * delta * invert_factor angle = G.interpolate_angle(angle, angle_target, delta * ROTATE_WEIGHT) - if not _disable_input: - angle_up_target += Input.get_axis("rotate_down", "rotate_up") * ROTATE_UP_SPEED * delta * invert_factor angle_up_target = clamp(angle_up_target, ANGLE_UP_MIN, ANGLE_UP_MAX) angle_up = G.interpolate_angle(angle_up, angle_up_target, delta * ROTATE_UP_WEIGHT) @@ -116,12 +125,6 @@ func follow(delta): # add 0.5, this is the head height ground = G.interpolate(ground, target.position + Vector3(0., 0.5, 0.), delta * MOVE_WEIGHT) - if not _disable_input: - var zoom_dist = Input.get_axis("zoom_in", "zoom_out") * delta - zoom_dist += float(Input.is_action_just_pressed("zoom_out_discrete")) * DISCRETE_DURATION - zoom_dist -= float(Input.is_action_just_pressed("zoom_in_discrete")) * DISCRETE_DURATION - zoom(zoom_dist) - camera_distance = G.interpolate(camera_distance, camera_distance_target, delta * (ZOOM_WEIGHT_AUTO if autozoom else ZOOM_WEIGHT)) position = ground + offset |