Sprite Kit SKAction Group Halting应用程序

时间:2015-04-08 20:08:28

标签: ios iphone swift ios8 sprite-kit

我正在尝试覆盖我的精灵中的removeFromParent动作,以便在删除精灵时,它会爆炸"首先,当我运行SKAction组动作时,应用程序冻结并退出。

有问题的代码如下:

class Trampoline: SKSpriteNode {
     override func removeFromParent() {
        //remove the physics body. The trampoline is essentially gone
        self.physicsBody = nil

        //create an array of explosion images from to animate
        var explosionAtlas: SKTextureAtlas = SKTextureAtlas(named: "explosion")
        var explosionFrames: [SKTexture] = [SKTexture]()
        var numImages: Int = explosionAtlas.textureNames.count
        var i = 1
        for (i = 1; i <= numImages; i++) {
            explosionFrames.append(explosionAtlas.textureNamed("explosion-\(i)"))
        }

        //execute the explodion and then deletion of the node
        let explosionAction = SKAction.animateWithTextures(explosionFrames, timePerFrame: 0.03, resize: true, restore: true)
        let removeAction = SKAction.removeFromParent()
        let group = SKAction.group([explosionAction, removeAction])
        self.runAction(group)
    }
}

当我只运行爆炸动作时,一切正常(因此我的纹理图集不是问题)。爆炸显示和动画。但是,即使我只运行removeAction,应用程序也会冻结。将它们作为一组运行会立即冻结(甚至在爆炸动画发生之前)。

我使用API​​错了吗?

2 个答案:

答案 0 :(得分:1)

问题

你的问题是你正在创造一个无限循环。

您正在覆盖removeFromParent,然后在removeFromParent内,您正在使用removeFromParent致电SKAction.removeFromParent()

您可以通过在println中添加removeFromParent或断点来观察无限循环,并查看它被调用的次数。如果你等待Xcode杀死你的应用程序并查看调用堆栈,你也可以看到无限循环 - 它应该是removeFromParent

解决方案

您应该将removeAction更改为:

let removeAction = SKAction.runBlock { super.removeFromParent() }

此更改意味着您允许SKSpriteNodeTrampoline的{​​{1}}类)处理实际删除。

希望有所帮助!

答案 1 :(得分:0)

这只是猜测。我有一个提示:

    yourSprite.removeFromParent()

在您使用的代码中:

    SKAction.removeFromParent()

我想你是在说自己&#34;自我&#34;删除而不是你的节点:

yourNode.runAction(组)

被修改