【问题标题】:How to detach a node from its parent and attach to another in SpriteKit如何在 SpriteKit 中将节点与其父节点分离并附加到另一个节点
【发布时间】:2014-05-07 17:11:07
【问题描述】:

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

    // 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];

但是,我在第二次运行此代码时闪烁,并且看起来并非完美无缺。有没有更快的方法从其父节点附加/分离节点?

【问题讨论】:

  • 不知道你为什么要这样做,但肯定有一个解决方案可以在没有“reparenting”的情况下工作,而且可以说它也是一个更好的解决方案。在最基本的层面上,它只需要将场景更新中的位置设置为另一个节点的位置。
  • 该节点是否有可能还有一个SKAction 正在进行中?
  • 是否还有其他代码会影响该节点的位置?而且它可能仍然会改变它的位置,即使只是为了一个框架?你正在做的事情应该有效,但我的猜测是还有其他原因导致了这个问题,你不认为应该是一个因素。我还假设setCenterPosition 中的内容完全符合您的预期。
  • 我刚刚做了一个测试,删除了一个父级并将其添加到另一个父级,只要我正确计算新位置,它就可以正常工作。我没有闪烁。因此,正如我所想的那样,这里还有更多可玩的地方。
  • 我跟踪另一个节点(有 SKAction 运动)的原因是玩家坐在这个节点上。当我希望玩家跳跃/移动时,我必须分离玩家节点。如果我只是根据移动节点更新玩家的位置,我会有一个小的延迟,导致看起来很糟糕的漂移。

标签: ios7 sprite-kit


【解决方案1】:

您不能将孩子从一个家长转移到另一个家长。您唯一的选择是从父节点中删除节点并添加到另一个父节点,正如您已经发现的那样,这会产生开/关效果。

除了更改游戏逻辑以防止必须为节点切换父节点之外,您对闪烁无能为力。

【讨论】:

  • 他在上面的例子中删除和添加。我能够做到这一点,而且我没有得到闪烁或开/关效果。
  • @prototypical - 它可能取决于执行操作时的帧速率。不过,他的问题是如何切换父母,恕我直言,这不是最好的编码选择。
  • 我只是指出您说它会产生开/关效果,但事实并非如此。是的,基于其他情况的帧率问题可能会导致闪烁。但是无论您选择哪种方法恕我直言,都不会发生任何事情。无论最佳/最差编码选项如何,它都能正常工作而不会闪烁。
  • 毫无疑问,我认为在不删除/添加的情况下管理此功能可能会更快。然而,它的大小,我不确定。这就是导致这种闪烁的原因,这更像是我所说的。
  • 如果我没有附加/分离并且只使用更新功能跟随节点,我会因为更新延迟而出现偏差。
【解决方案2】:

刚回到这个问题,直到现在才在cmets看到你的回复。

您在 cmets 中的说明应添加到问题中:

“假设在这种情况下使用 'joints' 没有帮助,有什么更好的方法可以将一个节点“附加”到另一个节点?”

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

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

然后在更新每一帧期间,您可以使用该引用将给定节点位置更新为所需的父节点。

这是一个在狗身上使用跳蚤的例子,存储在userData

flea.userData = [[NSMutableDictionary alloc]init];
[flea.userData setObject:dog forKey:@"parent"];

然后在处理跳蚤时的更新中,你会这样做:

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

当然,如果 flea 和 dog 在不同的坐标空间中,您也需要解决这个问题,但这只是存储引用的基本概念。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2019-12-07
    • 1970-01-01
    相关资源
    最近更新 更多