如何在需要时生成 SKSpriteNode?

How to spawn SKSpriteNode when needed?

我的 SpriteKit 游戏中有几个 SKSpriteNode,例如暂停背景和游戏结束场景以及按钮。现在我在 didMoveToView 中声明并添加它们并使用类似的东西:

let pauseButton = SKSpriteNode(imageNamed: "pauseButton")
let pauseBackground = SKSpriteNode (imageNamed: "pauseBackground")
let resumeButton = SKSpriteNode (imageNamed: "resumeButton")

然后,我正在初始化它们:

self.pauseButton.anchorPoint = CGPointMake(0.5, 0.5)
self.pauseButton.position = CGPointMake(CGRectGetWidth(self.frame) - self.cookieSpot / 3, CGRectGetMaxY(self.frame) - self.cookieSpot / 3)
pauseButton.size = self.pauseButton.size
pauseButton.name = "pauseButton"
pauseButton.zPosition = 1000

pauseBackground.position = CGPoint(x: self.size.width / 2, y: self.size.height / 2)
self.pauseBackground.hidden = true
self.pauseBackground.name = "pauseBackground"
self.pauseBackground.zPosition = +1
resumeButton.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMinY(self.frame) + self.resumeButton.size.height * 2 + self.resumeButton.size.height - self.resumeButton.size.height / 4)
self.resumeButton.hidden = true
self.resumeButton.name = "resumeButton"
self.resumeButton.zPosition = +1

然后添加它们:

self.addChild(pauseBackground)
self.addChild(resumeButton)
self.addChild(gameOverBackground)

当不需要它并且当用户点击暂停按钮时,我正在尝试使用这样的东西:

for touch: AnyObject in touches {
    let location = touch.locationInNode(self)
       switch self.nodeAtPoint(location) {
case pauseButton:
        self.pauseBackground.hidden = false
        self.resumeButton.hidden = false
        self.scene?.view?.paused = true
case resumeButton:
        self.pauseBackground.hidden = true
        self.resumeButton.hidden = true
        self.scene?.view?.paused = false
        default:
        println("not good")

   }
}

那根本不适合我。我猜他们正在产卵,但他们是看不见的。如何在不需要节点时存储这些节点并在适当的时候生成它们?

添加节点在 runloop and you are pausing the view before that...I guess the problem is related to that (tested it and I got same results). In Obj-C an easy workaround would be using the performSelector method like described here. In Swift it get trickier an you should probably use something like dispatch_after or go with something like this 结束时完成(使用 NSTimer)。希望这个对你有帮助。此外,这不是一个确定的答案,可能还有更多针对同一问题的解决方案。

编辑:

我刚刚发现可行 solution(暂停在某些方法中移动):

func pauseGame()
   {
         self.scene?.view?.paused = true
   }

然后在touchesBegan中调用

 self.runAction(SKAction.runBlock(self.pauseGame))

您的 touchesBegan 应该如下所示:

 override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {

        for touch: AnyObject in touches {
            let location = touch.locationInNode(self)
            switch self.nodeAtPoint(location) {
            case pauseButton:
                self.pauseBackground.hidden = false
                self.resumeButton.hidden = false

               self.runAction(SKAction.runBlock(self.pauseGame))
            case resumeButton:
                self.pauseBackground.hidden = true
                self.resumeButton.hidden = true
                self.scene?.view?.paused = false
            default:
                println("not good")

            }
        }
    }