这是“计算机正在按照您的指示执行的操作”的情况。
这一行:
TweenNode.interpolate_property(self, "modulate", modulate, Color(0, 0, 0, 1), 5, Tween.TRANS_EXPO, Tween.EASE_OUT_IN, 2)
它说,在 2 秒后设置为现在modulate
的值。然后在 5 秒内改变它的值,并有这样那样的缓和。modulate
Color(0, 0, 0, 1)
你每帧都这样做。因此,两秒后,每一帧,它将设置modulate
为两秒前的值。插值将尝试更改modulate
,只是为了在下一帧重置值。
因此:
看起来两秒钟后它会短暂闪烁黑色(但不是一直闪烁),然后又变回透明
如果你让它继续运行,你会看到再过两秒钟后它不会恢复透明。相反,它会回到你在两秒钟后看到的那种微黑。因为四秒后,那是两秒前的调制。
而且,正如您可以想象的那样,这意味着它会开始变得更暗。几分钟后它会变黑。
当然,我们可以跟踪interpolate_property
我们所做的呼叫。为此,我们将添加一个新属性,在其中跟踪我们告诉Tween
插入的值...</p>
好吧,我要退一步解释一下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
,但考虑到你想要不同的东西duration
,delay
那是行不通的。相反,我们可以简单地将其包装到另一个中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
just 使这个重构更容易解释。