我正在尝试覆盖我的精灵中的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错了吗?
答案 0 :(得分:1)
问题
你的问题是你正在创造一个无限循环。
您正在覆盖removeFromParent
,然后在removeFromParent
内,您正在使用removeFromParent
致电SKAction.removeFromParent()
。
您可以通过在println
中添加removeFromParent
或断点来观察无限循环,并查看它被调用的次数。如果你等待Xcode杀死你的应用程序并查看调用堆栈,你也可以看到无限循环 - 它应该是removeFromParent
。
解决方案
您应该将removeAction更改为:
let removeAction = SKAction.runBlock { super.removeFromParent() }
此更改意味着您允许SKSpriteNode
(Trampoline
的{{1}}类)处理实际删除。
希望有所帮助!
答案 1 :(得分:0)
这只是猜测。我有一个提示:
yourSprite.removeFromParent()
在您使用的代码中:
SKAction.removeFromParent()
我想你是在说自己&#34;自我&#34;删除而不是你的节点:
yourNode.runAction(组)
被修改