子场景 "slide" 可以在运行时进入父场景吗?
Can a child scene "slide" into a parent scene at runtime?
是否可以在运行时将场景(类型 Control
)“滑动”到场景的中间。
我有一个“父”场景,中间有一个空白区域。我想将一系列场景“滑动”到父场景的中央空白区域。
我想做这样的事情,但是有动画:
var qi = load("res://Child1.tscn").instance()
qi.get_node("/root/Child1")
$VBoxContainer/MiddleArea.add_child(qi)
然后稍后,在相同或另一种类型的场景中滑动,具有不同或相同的数据:
var qi = load("res://Child1.tscn").instance()
qi.get_node("/root/Child1")
$VBoxContainer/MiddleArea.add_child(qi)
序列由数据库中的数据驱动,因此在设计时无法预测可能需要出现的场景序列。
如果我没理解错的话,你想要的可以用Tween
来完成。
因此,首先将 Tween
添加到场景树中。我们可以将它保存在这样的变量中:
onready var tween := $Tween
然后我们可以用它来制作一个简单的动画:
$VBoxContainer/MiddleArea.add_child(qi)
var duration_seconds := 2.0
tween.interpolate_property(
qi,
"rect_position",
Vector2(-qi.rect_size.x, qi.rect_position.y),
qi.rect_position,
duration_seconds,
Tween.TRANS_CUBIC,
Tween.EASE_OUT
)
tween.start()
此代码将为场景的位置设置动画。起始位置 Vector2(-qi.rect_size.x, qi.rect_position.y)
就在屏幕左侧的外侧。最终位置是场景在动画之前的位置。
如果您在此行循环添加多个以等待动画结束后再执行下一个:
yield(tween, "tween_all_completed")
如果您要将场景添加到设置场景位置的容器中,您可能需要这样添加:
qi.modulate = Color.transparent
$Container.add_child(qi)
yield(get_tree(), "idle_frame")
qi.self_modulate = Color.white
这里qi.modulate = Color.transparent
将使场景不可见。然后我们将它添加到容器中,等待一帧yield(get_tree(), "idle_frame")
,在此期间容器设置场景的位置。最后我们使用 qi.self_modulate = Color.white
恢复可见性。 我们必须让场景不可见,这样它就不会出现一帧就消失然后被动画化。而且我们不使用 visible
因为容器可能会跳过定位场景。
是否可以在运行时将场景(类型 Control
)“滑动”到场景的中间。
我有一个“父”场景,中间有一个空白区域。我想将一系列场景“滑动”到父场景的中央空白区域。
我想做这样的事情,但是有动画:
var qi = load("res://Child1.tscn").instance()
qi.get_node("/root/Child1")
$VBoxContainer/MiddleArea.add_child(qi)
然后稍后,在相同或另一种类型的场景中滑动,具有不同或相同的数据:
var qi = load("res://Child1.tscn").instance()
qi.get_node("/root/Child1")
$VBoxContainer/MiddleArea.add_child(qi)
序列由数据库中的数据驱动,因此在设计时无法预测可能需要出现的场景序列。
如果我没理解错的话,你想要的可以用Tween
来完成。
因此,首先将 Tween
添加到场景树中。我们可以将它保存在这样的变量中:
onready var tween := $Tween
然后我们可以用它来制作一个简单的动画:
$VBoxContainer/MiddleArea.add_child(qi)
var duration_seconds := 2.0
tween.interpolate_property(
qi,
"rect_position",
Vector2(-qi.rect_size.x, qi.rect_position.y),
qi.rect_position,
duration_seconds,
Tween.TRANS_CUBIC,
Tween.EASE_OUT
)
tween.start()
此代码将为场景的位置设置动画。起始位置 Vector2(-qi.rect_size.x, qi.rect_position.y)
就在屏幕左侧的外侧。最终位置是场景在动画之前的位置。
如果您在此行循环添加多个以等待动画结束后再执行下一个:
yield(tween, "tween_all_completed")
如果您要将场景添加到设置场景位置的容器中,您可能需要这样添加:
qi.modulate = Color.transparent
$Container.add_child(qi)
yield(get_tree(), "idle_frame")
qi.self_modulate = Color.white
这里qi.modulate = Color.transparent
将使场景不可见。然后我们将它添加到容器中,等待一帧yield(get_tree(), "idle_frame")
,在此期间容器设置场景的位置。最后我们使用 qi.self_modulate = Color.white
恢复可见性。 我们必须让场景不可见,这样它就不会出现一帧就消失然后被动画化。而且我们不使用 visible
因为容器可能会跳过定位场景。