3

一天以来一直在努力解决这个问题,我真的不知道发生了什么。

我有一个非常简单的设置:一个 SKNode(我们称之为基),它包含另一个 SKNode(子基)以及几个 SKShapeNode 对象。有时,我将 SKShapeNode 对象之一(使用 removeFromParent)从基础节点移动到子基础节点。然后我应用一个 SKAction,它将节点移动到某个任意位置。

除了,当 SKShapeNode 已被移除并添加到子基础对象时,该 SKAction 不起作用。如果我将它从底座中取出,然后放回底座中,SKActions 将再次起作用。

我完全被难住了。当节点添加到另一个节点时,是否有一些属性在节点上设置,当我删除它时没有正确重置......?我无法想象这是应该发生的事情。

任何想法都会非常受欢迎。

更新:

这是我可以使用的一些代码。该函数位于 SKNode 的子类中。该类添加了一堆 SKShapeNodes,它还有另一个名为 testNode 的 SKNode,所以,事不宜迟:

-(void) removeThenAdd
{
    [someNode removeFromParent];

    [self.testNode addChild:someNode];

    SKAction* action = [SKAction moveTo:CGPointMake(200, 200) duration:1];

    SKNode* thatSameNodeJustAdded = [self.testNode.children objectAtIndex:0];

    [thatSameNodeJustAdded runAction:action];
}

另一个更新!

我刚刚发现,如果我在该节点位于 testNode 内时向该节点添加一个 SKAction,然后将其从 testNode 中删除并将其添加回其原始父级,则该操作将被激活。就像,我在这里错过了什么?这一定是我没有正确使用的某种设计行为。

4

2 回答 2

0

我也在我的 SpriteKit 项目中看到了这个问题。在我的例子中,我从场景编辑器中创建的 SKScene 文件中删除了一个节点,并将其添加到我当前的场景中。

在进行了一些调试之后,它表明这些操作根本没有运行。经过进一步调查,我发现了原因......似乎当您以这种方式将节点添加到场景时,isPaused属性设置为true. 这是故意的还是我无法确定的错误。

来自文档: https ://developer.apple.com/documentation/spritekit/sknode/1483113-ispaused

已暂停

如果值为 true,则在场景处理动作时跳过节点(及其所有后代)。

所以为了“修复”这个问题,在节点上运行任何 SKActions 之前,取消暂停节点:

node.isPaused = false
于 2020-04-27T00:05:34.993 回答
0

这似乎是 SDK 中的错误。我遇到了这个问题,因为我想在他们自己的场景文件中制作高级精灵(带有孩子、发射器等的精灵),这样我就可以有选择地加载它们,然后将它们添加到我的场景中。我想出了一个使用 NSKeyedArchiver 和 NSKeyedUnarchiver 的解决方法——将节点(或父节点)转换为数据,然后再返回,如果它是发射器或有子对象,则新对象已准备好添加到场景中作为发射器的节点,它们都将被复制并正确地重新添加。这是我为 swift 制作的扩展,就像一个魅力:

extension SKNode {
    // Pulling a node from one scene and putting it into another causes some problems with broken emitters :(
    // Fix here is to archive and then unarchive the node before returning
    class func nodeFromScene(nodeName : String, sceneFileName : String) -> SKNode? {
        if let scene = SKScene(fileNamed: sceneFileName), node = scene.childNodeWithName(nodeName) {
            let archive = NSKeyedArchiver.archivedDataWithRootObject(node)
            return NSKeyedUnarchiver.unarchiveObjectWithData(archive) as? SKNode
        }
        return nil
    }
}
于 2015-10-14T15:37:03.917 回答