使用补间延迟在黑白之间淡入戈多不起作用



我试图在2间切换之间的tween.interpolate_properties()取决于玩家是否移动。但是,延迟函数不起作用。第11行没有延迟,它立即工作(应该如此)。然而,当我添加2秒的延迟时,它看起来像两秒后它短暂地闪烁黑色(但不是所有的方式),然后又回到透明。附件是代码,请帮忙!

extends Sprite
onready var TweenNode = get_node("../Tween")
onready var velocity
func _ready():
modulate.a = 0
func _process(delta):
velocity = get_node("../../").velocity
if velocity == Vector2.ZERO:
TweenNode.interpolate_property(self, "modulate", modulate, Color(0, 0, 0, 1), 5, Tween.TRANS_EXPO, Tween.EASE_OUT_IN, 2)
else:
TweenNode.interpolate_property(self, "modulate", modulate, Color(0, 0, 0, 0), .1, Tween.TRANS_EXPO, Tween.EASE_OUT_IN)
TweenNode.start()

这是"计算机正在执行您的命令"的情况。

这条线:

TweenNode.interpolate_property(self, "modulate", modulate, Color(0, 0, 0, 1), 5, Tween.TRANS_EXPO, Tween.EASE_OUT_IN, 2)

表示,2秒后将modulate设置为modulate当前的值。然后在5秒的时间跨度内改变其值为Color(0, 0, 0, 1),这样,这样的缓和

每一帧都是这样。所以,两秒钟后,每一帧,它将modulate设置为两秒钟前的值。插值将尝试改变modulate,只是为了在下一帧重置值。

因此:

看起来两秒钟后它会短暂地闪烁黑色(但不是全部),然后又变回透明

如果你让它运行,你会看到两秒钟后,它没有回到透明状态。相反,它会在两秒钟后变回你看到的微黑。因为4秒后,这就是调制两秒前的值

而且,你可以想象,这意味着它会开始变得有点暗。几分钟后,它就会变成黑色。


当然,我们可以跟踪我们所做的interpolate_property调用。要做到这一点,我们需要添加一个新属性来记录我们告诉Tween要插入的值。


好吧,我将采取侧面步骤来解释follow_property!

使用follow_property,您可以告诉Tween将一个属性插入到另一个属性的值中。

因此,我们添加了新的属性,例如:
var _modulate_target:Color
顺便说一下,我们需要初始化它:
func _ready():
modulate.a = 0
_modulate_target = modulate

然后我们可以让Tween让一个属性跟随另一个属性:

_modulate_target = Color(0, 0, 0, 1)
TweenNode.follow_property(
self,
"modulate",
modulate,
self,
"_modulate_target",
5,
Tween.TRANS_EXPO,
Tween.EASE_OUT_IN,
2
)
TweenNode.start()

为了避免重置行为,我们检查新属性的值,如果它已经是我们想要的值,我们什么都不做:

if _modulate_target != Color(0, 0, 0, 1):
_modulate_target = Color(0, 0, 0, 1)
TweenNode.remove(self, "modulate")
TweenNode.follow_property(
self,
"modulate",
modulate,
self,
"_modulate_target",
5,
Tween.TRANS_EXPO,
Tween.EASE_OUT_IN,
2
)
TweenNode.start()

我还删除了modulate上的任何现有动画:

TweenNode.remove(self, "modulate")

对于每一个变化,你都会遵循这个模式。我主张使用setget,但考虑到你想要不同的durationdelay,这是不行的。相反,我们可以简单地将其包装成另一个func:

func _tween_modulate(target:Color, duration:float, delay:float) -> void:
if _modulate_target == target:
return
_modulate_target = target
TweenNode.remove(self, "modulate")
TweenNode.follow_property(
self,
"modulate",
modulate,
self,
"_modulate_target",
duration,
Tween.TRANS_EXPO,
Tween.EASE_OUT_IN,
delay
)
TweenNode.start()

你可以这样使用:

if velocity == Vector2.ZERO:
_tween_modulate(Color(0, 0, 0, 1), 5, 2)
else:
_tween_modulate(Color(0, 0, 0, 0), .1, 0)

请注意,您仍然需要_modulate_target来检查是否与target不同。当然,你可以使用interpolate_property:

func _tween_modulate(target:Color, duration:float, delay:float) -> void:
if _modulate_target == target:
return
_modulate_target = target
TweenNode.remove(self, "modulate")
TweenNode.interpolate_property(
self,
"modulate",
modulate,
target,
duration,
Tween.TRANS_EXPO,
Tween.EASE_OUT_IN,
delay
)
TweenNode.start()

使用follow_property只是让这个重构更容易解释。

最新更新