ios - SpriteKit SKAction 在删除和读取节点后不起作用

标签 ios objective-c sprite-kit

我已经为此苦恼了一天,我真的不知道发生了什么。

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

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

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

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

更新:

这是我可以用来生成它的一些代码。这个函数在 SKNode 的子类中。该类添加了一堆 SKShapeNode,它还有另一个 SKNode 称为 testNode,因此,事不宜迟:

-(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];
}

另一个更新!

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

最佳答案

这似乎是 SDK 中的错误。我遇到这个问题是因为我想在它们自己的场景文件中制作高级 Sprite (带有子元素、发射器等的 Sprite ),以便我可以有选择地加载它们,然后将它们添加到我的场景中。我想出了一个使用 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
    }
}

关于ios - SpriteKit SKAction 在删除和读取节点后不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19713070/

相关文章:

ios - SpriteKit 在 [self removeAllActions] 上崩溃;

如果在模拟器中运行较新的 iPhone,didBeginContact 中会出现快速错误

ios - map 图钉图像没有改变

iOS:主视图 -> 详细 View (如何使详细 View 可编辑)

ios - UITableView 中的 UIScrollView 中的 ContentOffset 问题

ios - XCTest:在没有完成 block 的情况下测试异步函数

android - 在移动应用程序(iOS/Android)上显示我的栅格 map

ios - 苹果可以在我的应用程序中批准信用卡表格吗?

iphone - 如何在 iphone 的 tabbar 中设置徽章值?

ios - 在 Xcode SpriteKit 中,使用 Swift 在一个方向上展开 SKSpritenode