更改父节点时动画运动的最佳方式?

问题描述

目前,我正在使用面向节点的方法制作纸牌游戏(《炉石传说》)。这意味着,每张纸牌都是一个节点,并且要将纸牌移动到指定位置(例如,玩家的手或战场),我需要在父节点之间移动子节点。

例如,要将卡片从我的手上移到战场上,我会在手上调用remove_child(),在战场上调用add_child()。

现在,当卡片无处不在时,这确实非常有效。但是,我希望它们平稳地从父节点移动到另一个节点。实现此目标的最佳方法是什么?还是有比使用节点更好的组织场景的方法

解决方法

在场景中添加一个Tween节点,然后从代码中可以执行以下操作:

var position_start = card.global_position
var position_end = combat_field.global_position
var duration_in_seconds = 1.0
tween.interpolate_property(card,"global_position",position_start,position_end,duration_in_seconds,Tween.TRANS_LINEAR)
tween.start()
yield(tween,"tween_completed") # wait until move animation is complete
card.get_parent().remove_child(card)
combat_field.add_child(card)
card.position = Vector2() # reset local position after re-parenting

card是您要设置动画的节点。

combat_field是您要卡片移动到的节点。

tween是您的Tween节点。

演示:

enter image description here

使用其他方法吗?

我不知道为什么要更改卡的父节点。也许,有一种更简单的方法?

如果您将它们分配给另一个组怎么办?这样,您可以基于组而不是父节点在代码中具有不同的逻辑。

另一个想法是,您可以创建一个单例类来跟踪游戏的状态。例如,哪些牌在玩家手中,哪些牌在战场上。

,

我相信您现在的操作方式是重定Godot中节点的唯一方式。可能唯一要做的更改是创建自己的reparent函数,并将当前代码(即remove_child()和add_child()方法)放入其中,并假设您尚未这样做。这样,您只需在需要重设节点时就可以调用该函数。