【问题标题】:How to spawn SKSpriteNode when needed?如何在需要时生成 SKSpriteNode?
【发布时间】:2023-03-27 14:41:01
【问题描述】:

我的 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")

   }
}

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

【问题讨论】:

  • “产卵”是什么意思?
  • 应该可以。也许它与暂停按钮的初始化有关?发给我们
  • @sangony 我的意思是将它们展示在其他节点之上。例如,当用户点击一个按钮时,想象一下出现在屏幕上的暂停场景。现在我在一个类中声明它,定位它们并在didMoveToView 中执行addChild 并将它们设置为隐藏。然后,当用户与暂停按钮交互时,我希望它们出现在其他节点上方。我尝试hidden = false,但它们仍然不可见。虽然如果我单击恢复按钮应该所在的位置,我可以取消暂停游戏。 @M321K 我现在更新了我的代码!

标签: ios swift sprite-kit


【解决方案1】:

添加节点是在runloop 的末尾完成的,并且您在此之前暂停了视图...我想问题与此有关(经过测试,我得到了相同的结果)。在 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")

            }
        }
    }

【讨论】:

  • 嗯,太好了!如果我理解正确,让我说清楚。您是否建议在我的 switch 语句中在 self.pauseBackground.hidden = false self.resumeButton.hidden = false 之后调用 pause SKAction?还是我应该重写所有的 touchesBegan 函数?
  • 尝试调用 self.runAction(SKAction.runBlock(self.pauseGame)) 而不是 self.scene?.view?.paused = true ...它应该可以工作(对我有用)。
  • 是的!它完全奏效了!谢谢@Whirlwind!最后我可以走得更远:D
猜你喜欢
  • 1970-01-01
  • 2013-05-18
  • 2014-05-22
  • 1970-01-01
  • 2019-08-02
  • 2019-05-12
  • 1970-01-01
  • 1970-01-01
  • 2017-12-11
相关资源
最近更新 更多