Skip to main content
 首页 » 操作系统

ios之如何在需要时生成 SKSpriteNode

2024年01月01日74xxx_UU

我的 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 结束时完成并且您在此之前暂停了 View ...我想问题与此有关(对其进行了测试,我得到了相同的结果)。在 Obj-C 中,一个简单的解决方法是使用 performSelector描述的方法 here .在 Swift 中它变得更棘手,你应该使用类似 dispatch_after 的东西或者使用类似 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") 
 
            } 
        } 
    }