From e7d0036c61a6d0268fea8b2939317e63b3273b17 Mon Sep 17 00:00:00 2001 From: Steven Wroblewski Date: Fri, 17 Apr 2026 21:17:58 +0200 Subject: [PATCH] fix(navigator): kill active tween before starting new navigation to prevent camera jitter --- scripts/systems/room_navigator.gd | 37 ++++++++++++++++++------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/scripts/systems/room_navigator.gd b/scripts/systems/room_navigator.gd index 5ee3546..f567ea5 100644 --- a/scripts/systems/room_navigator.gd +++ b/scripts/systems/room_navigator.gd @@ -15,6 +15,7 @@ var _current_floor: int = 0 var _current_room: int = 0 var _is_at_home: bool = false var _camera: Camera2D +var _active_tween: Tween func initialize(camera: Camera2D) -> void: @@ -35,11 +36,13 @@ func go_to_room(floor_index: int, room_index: int) -> void: _current_room = room_index var target_x: float = room_index * ROOM_WIDTH + ROOM_WIDTH * 0.5 var target_y: float = floor_index * -FLOOR_HEIGHT + FLOOR_HEIGHT * 0.5 - var tween: Tween = create_tween() - tween.set_ease(Tween.EASE_IN_OUT) - tween.set_trans(Tween.TRANS_SINE) - tween.tween_property(_camera, "position", Vector2(target_x, target_y), CAMERA_TWEEN_DURATION) - tween.finished.connect(func() -> void: room_changed.emit(floor_index, room_index)) + if _active_tween != null: + _active_tween.kill() + _active_tween = create_tween() + _active_tween.set_ease(Tween.EASE_IN_OUT) + _active_tween.set_trans(Tween.TRANS_SINE) + _active_tween.tween_property(_camera, "position", Vector2(target_x, target_y), CAMERA_TWEEN_DURATION) + _active_tween.finished.connect(func() -> void: room_changed.emit(floor_index, room_index)) func go_to_home() -> void: @@ -48,11 +51,13 @@ func go_to_home() -> void: if _is_at_home: return _is_at_home = true - var tween: Tween = create_tween() - tween.set_ease(Tween.EASE_IN_OUT) - tween.set_trans(Tween.TRANS_SINE) - tween.tween_property(_camera, "position", Vector2(HOME_CAMERA_X, HOME_CAMERA_Y), CAMERA_TWEEN_DURATION) - tween.finished.connect(func() -> void: home_entered.emit()) + if _active_tween != null: + _active_tween.kill() + _active_tween = create_tween() + _active_tween.set_ease(Tween.EASE_IN_OUT) + _active_tween.set_trans(Tween.TRANS_SINE) + _active_tween.tween_property(_camera, "position", Vector2(HOME_CAMERA_X, HOME_CAMERA_Y), CAMERA_TWEEN_DURATION) + _active_tween.finished.connect(func() -> void: home_entered.emit()) func go_to_hospital() -> void: @@ -63,11 +68,13 @@ func go_to_hospital() -> void: _is_at_home = false var target_x: float = _current_room * ROOM_WIDTH + ROOM_WIDTH * 0.5 var target_y: float = _current_floor * -FLOOR_HEIGHT + FLOOR_HEIGHT * 0.5 - var tween: Tween = create_tween() - tween.set_ease(Tween.EASE_IN_OUT) - tween.set_trans(Tween.TRANS_SINE) - tween.tween_property(_camera, "position", Vector2(target_x, target_y), CAMERA_TWEEN_DURATION) - tween.finished.connect(func() -> void: hospital_entered.emit()) + if _active_tween != null: + _active_tween.kill() + _active_tween = create_tween() + _active_tween.set_ease(Tween.EASE_IN_OUT) + _active_tween.set_trans(Tween.TRANS_SINE) + _active_tween.tween_property(_camera, "position", Vector2(target_x, target_y), CAMERA_TWEEN_DURATION) + _active_tween.finished.connect(func() -> void: hospital_entered.emit()) func get_current_floor() -> int: