Files
ai-game-2/camera_transition.gd
2024-07-01 08:24:25 -07:00

100 lines
3.0 KiB
GDScript

extends Node
@onready var camera2D: Camera2D = $Camera2D
var transitioning: bool = false
func _ready() -> void:
#camera2D.current = false
pass
func switch_camera(from, to) -> void:
#from.current = false
to.make_current()
func get_effective_position(center_pos: Vector2):
var viewport_rect = get_viewport().get_visible_rect()
var zoom = camera2D.zoom
var half_viewport_width = viewport_rect.size.x * 0.5 * zoom.x
var half_viewport_height = viewport_rect.size.y * 0.5 * zoom.y
var min_x = camera2D.limit_left + half_viewport_width
var max_x = camera2D.limit_right - half_viewport_width
var min_y = camera2D.limit_top + half_viewport_height
var max_y = camera2D.limit_bottom - half_viewport_height
var clamped_x = clamp(float(center_pos.x), min_x, max_x)
var clamped_y = clamp(float(center_pos.y), min_y, max_y)
var effective_pos = Vector2(clamped_x, clamped_y)
return effective_pos
func transition_camera2D(from: Camera2D, to: Camera2D, duration: float = 1.0) -> void:
if transitioning: return
# Copy the parameters of the first camera
camera2D.custom_viewport = get_tree().root.get_node("Node2D/SceneViewport")
camera2D.zoom = from.zoom
camera2D.offset = from.offset
camera2D.light_mask = from.light_mask
camera2D.set_limit(SIDE_BOTTOM, from.limit_bottom)
camera2D.set_limit(SIDE_RIGHT, from.limit_right)
camera2D.set_limit(SIDE_LEFT, from.limit_left)
camera2D.set_limit(SIDE_TOP, from.limit_top)
camera2D.limit_left = from.limit_left
camera2D.limit_right = from.limit_right
camera2D.limit_top = from.limit_top
camera2D.limit_bottom = from.limit_bottom
to.limit_left = from.limit_left
to.limit_right = from.limit_right
to.limit_top = from.limit_top
to.limit_bottom = from.limit_bottom
#camera2D.
# Move our transition camera to the first camera position
var gt = from.get_screen_center_position()
camera2D.global_transform.origin = gt
#camera2D.global_transform.y = gt.y
#camera2D.set_screen
#camera2D.get_screen_center_position()
# Make our transition camera current
#camera2D.enabled=true
#to.enabled=true
camera2D.make_current()
camera2D.reset_smoothing()
camera2D.align()
transitioning = true
var tween = get_tree().create_tween()
tween.set_parallel(true)
tween.set_trans(Tween.TRANS_CUBIC)
tween.set_ease(Tween.EASE_IN_OUT)
var dest = Transform2D(to.global_transform)
get_effective_position(dest.origin)
print("TOOOO")
print(to)
to.get_screen_center_position()
var gz = to.get_screen_center_position()
var ox = to.get_target_position()
var gl = to.global_transform
print()
tween.tween_property(camera2D, "global_transform", dest, 2.0).from_current()
tween.tween_property(camera2D, "offset", to.offset, 2.0).from_current()
tween.tween_property(camera2D, "zoom", to.zoom, 2.0).from_current()
#tween.tween_property(camera2D, "zoom", to.zoom, 3.0)
tween.play()
# Wait for the tween to complete
await tween.finished
# Make the second camera current
to.make_current()
transitioning = false
#from.enabled=false
#camera2D.enabled=false