Godot Version
4.2.2
Question
Hi, can anyone help me with this? I tried to do a scene transition by taking a screenshot of the viewport and then attaching it to a sprite2D. However, the objects from the next scene seems to be overlapping the image. Also the screenshot image is brighter than the viewport which could be caused by the WorldEnvironment background mode being a canvas but I’m not sure if there’s another way to create a background image in 3D.

extends Node
const transition_node_name = "transition_node"
var is_showing_transition = false
var function_to_call: Callable
var start_position := Vector2.ZERO
var end_position := Vector2.ZERO
var swipe_threshold := 100
enum TransitionType {
swipeLeft = 1,
swipeRight = 2
}
func setup_sprite():
var transition_sprite = load("res://scenes/transition_sprite.tscn").instantiate() as Sprite2D
var image = get_viewport().get_texture().get_image()
var transition_texture = ImageTexture.create_from_image(image)
transition_sprite.name = transition_node_name
transition_sprite.texture = transition_texture
return transition_sprite
func change_scene(new_scene_location: String, transition_type: int):
if is_showing_transition:
return
is_showing_transition = true
var transition_sprite = setup_sprite()
get_tree().change_scene_to_file(new_scene_location)
function_to_call = show_transition.bind(transition_sprite, transition_type)
get_tree().node_added.connect(function_to_call)
func show_transition(_new_node, transition_sprite: Sprite2D, type: TransitionType):
if get_tree().root.get_node_or_null(transition_node_name) != null:
return
get_tree().root.add_child(transition_sprite)
var transition_tween = create_tween().set_parallel()
if type == TransitionType.swipeLeft:
transition_tween.tween_property(transition_sprite, "global_position", Vector2(-1050, transition_sprite.global_position.y), 1)
elif type == TransitionType.swipeRight:
transition_tween.tween_property(transition_sprite, "global_position", Vector2(1050, transition_sprite.global_position.y), 2)
transition_tween.tween_property(transition_sprite, "rotation", deg_to_rad(0), 1)
transition_tween.finished.connect(transition_sprite.queue_free)
await transition_tween.finished
get_tree().node_added.disconnect(function_to_call)
is_showing_transition = false
# Detect swipe input
func _input(event):
if event is InputEventMouseButton and event.pressed:
start_position = event.position # Store start position
elif event is InputEventMouseMotion:
end_position = event.position # Update end position
elif event is InputEventMouseButton and not event.pressed:
var swipe_distance = end_position.x - start_position.x
if swipe_distance < -swipe_threshold: # Swiped left
TransitionManager.change_scene("res://scenes/kitchen.tscn", TransitionType.swipeLeft)
elif swipe_distance > swipe_threshold: # Swiped right (Fixed!)
TransitionManager.change_scene("res://scenes/order2.tscn", TransitionType.swipeRight)