我试图覆盖我的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() }
此更改意味着您要让
SKSpriteNode
(Trampoline
的super
类)处理实际的删除操作。希望有帮助!
关于ios - Sprite Kit SKAction Group暂停应用程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29524389/