当 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 不需要调用超过一次。它会自动运行里面的方块。

尝试修复它们并告诉我发生了什么。