当 SKSpriteNode 离开 SKScene 时自动调用 removeFromParent()
removeFromParent() automatically called when an SKSpriteNode moves off the SKScene
据我了解,已添加到 SKScene 的 SKSpriteNode 将一直存在,直到调用 removeFromParent() 或任何其他删除方法。
我已经有 2 个月没有接触 SpriteKit 了,我记得就是这样。但是出于某种原因,今天在编程时,我意识到了一些奇怪的事情;我正在查看我的节点数,即使我正在执行 .repeatActionForever
不断实例化一个在屏幕上运行的新 SKSpriteNode,它也没有增加。代码中的任何地方都没有 remove
调用。这是创建 SKSpriteNode 的代码块:
//function in GameScene
func spawnEnemy() {
let enemy = SKSpriteNode(imageNamed: "enemy")
enemy.position = CGPoint(x: size.width + enemy.size.width/2, y: size.height/2)
let actionMove = SKAction.moveToX(-enemy.size.width/2, duration: 2.0)
enemy.runAction(actionMove)
}
//inside update()
runAction(SKAction.repeatActionForever(SKAction.runBlock(spawnEnemy))
这是模拟器显示的 gif:http://i.imgur.com/c8eyFDE.gif
我的印象是穿裙子的老太太的踩踏会在屏幕上徘徊,节点数会继续增加,但由于某种原因,节点数保持在 42 个节点,就好像屏幕外的节点会自动删除。
同样,我在任何地方都没有删除电话。
节点数只计算屏幕上可见的节点数。因此,屏幕上有 42 个节点,屏幕外有更多节点。
要检查没有任何内容被删除,您可以像这样子类化 SKSpriteNode
:
class Enemy : SKSpriteNode {
override func removeFromParent() {
super.removeFromParent()
println("An enemy was removed!")
}
}
那么在你的场景中:
let enemy = Enemy(imageNamed: "enemy")
现在,如果敌人以某种方式被移除,你肯定会知道。
如果事实证明敌人在离开屏幕后仍然存在,我建议使用以下任一方法移除节点:
1. 像这样使用 runAction(_ action: SKAction!, completion block: (() -> Void)!)
:
enemy.runAction(actionMove) { enemy.removeFromParent() }
2. 使用 SKAction.removeFromParent()
并创建一个序列 SKActions
:
let actionMove = SKAction.moveToX(-enemy.size.width/2, duration: 2.0)
let remove = SKAction.removeFromParent()
enemy.runAction(SKAction.sequence([actionMove, remove]))
希望对您的问题有所帮助。
您的代码中可能存在一些错误:
1.I 没有看到任何关于在场景中添加节点的代码。需要将敌人添加到场景或场景的子场景中。
2.The 方法 repeadActionForever 不需要调用超过一次。它会自动运行里面的方块。
尝试修复它们并告诉我发生了什么。
据我了解,已添加到 SKScene 的 SKSpriteNode 将一直存在,直到调用 removeFromParent() 或任何其他删除方法。
我已经有 2 个月没有接触 SpriteKit 了,我记得就是这样。但是出于某种原因,今天在编程时,我意识到了一些奇怪的事情;我正在查看我的节点数,即使我正在执行 .repeatActionForever
不断实例化一个在屏幕上运行的新 SKSpriteNode,它也没有增加。代码中的任何地方都没有 remove
调用。这是创建 SKSpriteNode 的代码块:
//function in GameScene
func spawnEnemy() {
let enemy = SKSpriteNode(imageNamed: "enemy")
enemy.position = CGPoint(x: size.width + enemy.size.width/2, y: size.height/2)
let actionMove = SKAction.moveToX(-enemy.size.width/2, duration: 2.0)
enemy.runAction(actionMove)
}
//inside update()
runAction(SKAction.repeatActionForever(SKAction.runBlock(spawnEnemy))
这是模拟器显示的 gif:http://i.imgur.com/c8eyFDE.gif
我的印象是穿裙子的老太太的踩踏会在屏幕上徘徊,节点数会继续增加,但由于某种原因,节点数保持在 42 个节点,就好像屏幕外的节点会自动删除。
同样,我在任何地方都没有删除电话。
节点数只计算屏幕上可见的节点数。因此,屏幕上有 42 个节点,屏幕外有更多节点。
要检查没有任何内容被删除,您可以像这样子类化 SKSpriteNode
:
class Enemy : SKSpriteNode {
override func removeFromParent() {
super.removeFromParent()
println("An enemy was removed!")
}
}
那么在你的场景中:
let enemy = Enemy(imageNamed: "enemy")
现在,如果敌人以某种方式被移除,你肯定会知道。
如果事实证明敌人在离开屏幕后仍然存在,我建议使用以下任一方法移除节点:
1. 像这样使用 runAction(_ action: SKAction!, completion block: (() -> Void)!)
:
enemy.runAction(actionMove) { enemy.removeFromParent() }
2. 使用 SKAction.removeFromParent()
并创建一个序列 SKActions
:
let actionMove = SKAction.moveToX(-enemy.size.width/2, duration: 2.0)
let remove = SKAction.removeFromParent()
enemy.runAction(SKAction.sequence([actionMove, remove]))
希望对您的问题有所帮助。
您的代码中可能存在一些错误:
1.I 没有看到任何关于在场景中添加节点的代码。需要将敌人添加到场景或场景的子场景中。
2.The 方法 repeadActionForever 不需要调用超过一次。它会自动运行里面的方块。
尝试修复它们并告诉我发生了什么。