当SKSpriteNode离开SKScene

时间:2015-05-05 20:40:59

标签: sprite-kit

据我了解,已添加到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个节点不变,就好像节点一样屏幕外被自动删除。

同样,我在任何地方都没有删除电话。

2 个答案:

答案 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不需要被调用超过一次。它将自动运行块内部。

尝试修复它们,让我知道会发生什么。