Sprite Kit SKAction 组暂停应用程序
Sprite Kit SKAction Group Halting Application
我试图覆盖我的精灵中的 removeFromParent 操作,以便在移除精灵时,它首先 "explodes",但是,当我 运行 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错了吗?
这只是一个猜测。我有一个提示给你:
yourSprite.removeFromParent()
并且在您的代码中使用:
SKAction.removeFromParent()
我想你是说要删除 "self" 而不是你的节点:
yourNode.runAction(组)
已编辑
问题
你的问题是你正在创建一个无限循环。
您正在覆盖 removeFromParent
,然后在 removeFromParent
内您使用 SKAction.removeFromParent()
调用 removeFromParent
。
您可以通过在 removeFromParent
中添加 println
或断点来自己观察无限循环,并查看它被调用了多少次。如果您等待 Xcode 杀死您的应用并查看调用堆栈,您还可以看到无限循环 - 它应该充满 removeFromParent
.
解决方案
您应该将 removeAction 更改为:
let removeAction = SKAction.runBlock { super.removeFromParent() }
此更改意味着您让 SKSpriteNode
(Trampoline
的 super
class)处理实际删除。
希望对您有所帮助!
我试图覆盖我的精灵中的 removeFromParent 操作,以便在移除精灵时,它首先 "explodes",但是,当我 运行 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错了吗?
这只是一个猜测。我有一个提示给你:
yourSprite.removeFromParent()
并且在您的代码中使用:
SKAction.removeFromParent()
我想你是说要删除 "self" 而不是你的节点:
yourNode.runAction(组)
已编辑
问题
你的问题是你正在创建一个无限循环。
您正在覆盖 removeFromParent
,然后在 removeFromParent
内您使用 SKAction.removeFromParent()
调用 removeFromParent
。
您可以通过在 removeFromParent
中添加 println
或断点来自己观察无限循环,并查看它被调用了多少次。如果您等待 Xcode 杀死您的应用并查看调用堆栈,您还可以看到无限循环 - 它应该充满 removeFromParent
.
解决方案
您应该将 removeAction 更改为:
let removeAction = SKAction.runBlock { super.removeFromParent() }
此更改意味着您让 SKSpriteNode
(Trampoline
的 super
class)处理实际删除。
希望对您有所帮助!