2

我试图在 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()
4

1 回答 1

2

这是“计算机正在按照您的指示执行的操作”的情况。

这一行:

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

它说,在 2 秒后设置为现在modulate的值。然后在 5 秒内改变它的值,并有这样那样的缓和。modulateColor(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,但考虑到你想要不同的东西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_propertyjust 使这个重构更容易解释。

于 2021-10-21T10:01:32.440 回答