Ios7 如何在SpriteKit中将节点与其父节点分离并连接到另一个节点

Ios7 如何在SpriteKit中将节点与其父节点分离并连接到另一个节点,ios7,sprite-kit,Ios7,Sprite Kit,我正在尝试快速将一个节点与其父节点分离并连接到另一个节点,以便准确跟踪父节点的位置。我使用以下代码: // detach from parent [_player removeFromParent]; // attach back to world node, at the same visual location, before taking action [_player setCenterPosition: CGPointMake(newPosX,newP

我正在尝试快速将一个节点与其父节点分离并连接到另一个节点,以便准确跟踪父节点的位置。我使用以下代码:

    // detach from parent
    [_player removeFromParent];

    // attach back to world node, at the same visual location, before taking action
    [_player setCenterPosition: CGPointMake(newPosX,newPosY)];   
    [_worldNode addChild:_player];

然而,我在第二次运行这段代码时出现了闪烁,它看起来并不是完美无缺的。有没有更快的方法将节点与其父节点连接/分离?

不能将子节点从一个父节点转移到另一个父节点。您唯一的选择是从父节点中删除节点,然后添加到另一个父节点,正如您已经了解的那样,这会创建开/关效果


对于闪烁,除了更改游戏逻辑以防止必须切换节点的父节点外,您没有什么可以做的。

刚刚回到这个问题,直到现在才在评论中看到您的答复

您在评论中的澄清应添加到问题中:

“假设在这种情况下使用“关节”没有帮助,有什么更好的方法将一个节点“连接”到另一个节点?”

可以使用的一个概念是子类化并创建一个iVar或属性,在其中存储对要将其附加到的对象的引用

没有子类化的替代方法是将该引用存储在节点的
userData
属性中

然后在更新每个帧的过程中,可以使用该引用将给定节点位置更新为其所需的父节点

下面是一个在狗身上使用跳蚤存储在
userData
中的示例:

flea.userData = [[NSMutableDictionary alloc]init];
[flea.userData setObject:dog forKey:@"parent"];
然后在处理跳蚤的更新中,您将执行以下操作:

SKNode *fleaParent = [flea.userdata valueForKey:@"parent"];
flea.position = fleaParent.position;

当然,如果跳蚤和狗位于不同的坐标空间,您也需要解决这个问题,但这只是存储引用的基本概念。

不知道为什么要这样做,但肯定有一种解决方案可以不进行“重新租用”,可以说它也是一种更好的解决方案。在最基本的层面上,它只需要将场景更新中的位置设置为另一个节点的位置。是否有可能该节点仍在执行
SKAction
?是否有任何其他代码影响该节点的位置?它可能会改变它的位置,即使只是一帧?你所做的应该是有效的,但是我的猜测是有其他原因导致了这个问题,你不认为这应该是一个因素。我还假设
setCenterPosition
中的任何内容都能完全满足您的期望。我只是做了一个测试,删除一个父对象并将其添加到另一个父对象,只要正确计算新位置,它就可以正常工作。我看不到闪烁。所以,正如我所想,这里还有更多的游戏。我之所以跟踪另一个节点(有SKAction动作的节点),是因为玩家坐在这个节点上。当我想让玩家跳跃/移动时,我必须分离玩家节点。如果我只是根据移动的节点更新玩家的位置,我会有一个小的延迟,这会导致一个看起来很糟糕的漂移。他在上面的例子中删除并添加了。我能够做到这一点,而且我没有得到闪烁或开/关效果。@prototypic-这可能取决于采取动作时的帧速率。他的问题是如何转换父母,这不是最好的编码选择。我只是指出,你是说它会产生开/关效应,但事实并非如此。是的,基于其他情况的帧速率问题可能会导致闪烁。但无论你选择什么方法,都不会发生什么。无论最佳/最差的编码选项如何,它都不会闪烁。毫无疑问,我认为在不删除/添加的情况下管理此功能可能会更快。然而,我不确定这有多大。这可能是导致闪烁的原因,更多的是我所说的。如果我没有连接/分离,并且只使用更新功能跟踪节点,我会因为更新延迟而出现漂移。