据我了解,已添加到SKScene的SKSpriteNodes将一直停留在那里,直到removeFromParent()或任何其他remove方法被调用。
我已经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个节点不变,就好像节点一样屏幕外被自动删除。
同样,我在任何地方都没有删除电话。
答案 0 :(得分:2)
节点计数仅计算屏幕上可见的节点。因此,您在屏幕上有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 :(得分:1)
您的代码中可能存在一些错误:
1.我没有看到任何关于在场景中添加节点的代码。需要将敌人添加到场景的场景或孩子中 2.方法repeadActionForever不需要被调用超过一次。它将自动运行块内部。
尝试修复它们,让我知道会发生什么。