我试图覆盖我的Sprite中的removeFromParent操作,以便当删除Sprite时,它首先“爆炸”,但是,当我运行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错误吗?

最佳答案

问题

您的问题是您正在创建一个无限循环。

您要覆盖removeFromParent,然后在removeFromParent中使用removeFromParent调用SKAction.removeFromParent()

您可以通过在println中添加removeFromParent或断点来自己观察无限循环,并查看它被调用了多少次。如果您等待Xcode杀死应用程序并查看调用堆栈,那么您还可以看到无限循环-它应该充满removeFromParent

解决方案

您应该将removeAction更改为:

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


此更改意味着您要让SKSpriteNodeTrampolinesuper类)处理实际的删除操作。

希望有帮助!

关于ios - Sprite Kit SKAction Group暂停应用程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29524389/

10-13 03:48