(Swift + Spritekit) - 完全删除节点及其数据

Posted

技术标签:

【中文标题】(Swift + Spritekit) - 完全删除节点及其数据【英文标题】:(Swift + Spritekit) - remove node and its data entirely 【发布时间】:2015-03-23 17:15:43 【问题描述】:

我正在为 ios 开发一款小游戏。

我的场景中有一个 SKSpriteNode - 当我使用“removeFromParent”删除它并触摸它最后进入的区域时,我仍然可以使用该功能。

我的代码如下:

    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) 
    /* Called when a touch begins */

    for touch: AnyObject in touches 
        let location = touch.locationInNode(self)

        if tapToPlayNode.containsPoint(location)
            tapToPlayNode.removeFromParent()
            startNewGame()
        
    


func startNewGame()
    //Starts a new game with resetted values and characters in position
    println("Ready.. set.. GO!")

    //Shows the ui (value 1)
    toggleUiWithValue(1)

换句话说,我得到“Ready.. set.. GO!”即使在删除区域后,当我触摸该区域时也会输出。

有什么线索吗?

最佳,

【问题讨论】:

【参考方案1】:

您的 tapToPlayNode 仍由 self 保留并从其父级中删除。 您应该将其设为可选 var tapToPlayNode:SKSpriteNode? 并在将其从其父级中删除后将其设为 nil,如下所示:

if let playNode = self.tapToPlayNode 
   for touch: AnyObject in touches 
   let location = touch.locationInNode(self)

        if playNode.containsPoint(location) 
            playNode.removeFromParent()
            startNewGame()
            self.tapToPlayNode = nil // il it here!
            break
        
    

您还可以避免保留对 tapToPlayNode 的引用,并在初始化时为其命名:

node.name = @"tapToPlayNodeName"
// Add node to scene and do not keep a var to hold it!

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) 
/* Called when a touch begins */

    // Retrieve the ode here
    let tapToPlayNode = container.childNodeWithName("tapToPlayNodeName")!
    for touch: AnyObject in touches 
       let location = touch.locationInNode(self)

        if tapToPlayNode.containsPoint(location)
            tapToPlayNode.removeFromParent()
            startNewGame()
        
    

【讨论】:

非常感谢您的快速回答,Bsarr!一个快速的方法:当我使用“var tapToPlayNode:SKSpriteNode?”我似乎无法对节点进行纹理处理? @bsarr007 重新启动新游戏后是否必须将 SKSpriteNode 设为 nil,或者在开始新游戏之前将其从父级中删除后它是否仍然有效?目前我需要擦除一个可选的 SKSpriteNodes 列表,但在从父级删除后将它们设置为 nil 似乎不起作用。谢谢。 @J.Treutlein,我不知道你的问题,但在我给出的第二个例子中,你不必什么都没有,SpriteKitNode "tapToPlayNodeName" 只是被名称引用,那里没有保存它的变量,在将它从它的父级中删除后,它就不再被引用了。

以上是关于(Swift + Spritekit) - 完全删除节点及其数据的主要内容,如果未能解决你的问题,请参考以下文章

swift spritekit 随着游戏时间的推移增加重力?

如何访问 SpriteKit 场景编辑器参考节点上自定义类中包含的 Swift 中的变量?

Swift / SpriteKit:如何创建水滴效果?

Swift,SpriteKit:如何保存场景的整个进度

将 SKSpriteNode 移动 Y - Swift 2 + SpriteKit

SpriteKit 设备方向改变导致 SKLabelNode 变形 Swift