Ios &引用;轻触“继续”;暂停文本SpriteKit

Ios &引用;轻触“继续”;暂停文本SpriteKit,ios,swift,sprite-kit,Ios,Swift,Sprite Kit,我知道SpriteKit已经能够处理当应用程序进入非活动状态时暂停游戏的问题,但我正在尝试的是在应用程序重新进入活动状态时添加一个SKLabelNode“点击恢复”。现在它正在正确调用我的函数并暂停游戏,但文本没有显示 AppDelegate.swift 斯威夫特 类游戏场景:SKScene,skphysiccontactdelegate{ ... 让tapToResume=SKLabelNode(FontName:“值得注意”) ... 覆盖func didMoveToView(视图:SKVi

我知道SpriteKit已经能够处理当应用程序进入非活动状态时暂停游戏的问题,但我正在尝试的是在应用程序重新进入活动状态时添加一个SKLabelNode“点击恢复”。现在它正在正确调用我的函数并暂停游戏,但文本没有显示

AppDelegate.swift 斯威夫特
类游戏场景:SKScene,skphysiccontactdelegate{
...
让tapToResume=SKLabelNode(FontName:“值得注意”)
...
覆盖func didMoveToView(视图:SKView){
...
NSNotificationCenter.defaultCenter().addObserver(self,选择器:选择器(“pauseGameScene”),名称:“pauseGameScene”,对象:nil)
NSNotificationCenter.defaultCenter().addObserver(self,选择器:选择器(“showPauseText”),名称:“showPauseText”,对象:nil)
tapToResume.text=“点击继续”
tapToResume.position=CGPoint(x:CGRectGetMidX(self.frame),y:CGRectGetMidY(self.frame))
tapToResume.fontSize=55
tapToResume.hidden=true
self.addChild(tapToResume)
...
}
func pauseGameScene(){
println(“暂停游戏”)
self.view?.paused=true
}
func showPauseText(){
如果self.view?.paused==true{
tapToResume.hidden=false
println(“显示文本”)
}
}
覆盖func touchesBegined(触摸:设置,withEvent事件:UIEvent){
...
如果自我暂停{
self.view?.paused=false
如果tapToResume.hidden==false{
tapToResume.hidden=true
}
}
}
...
}
编辑:

下面是我的终端输出的屏幕截图,以及我对上述代码的最新编辑:
我想我遇到了问题。您应该首先调用
pausegamese()
。然后
view?.paused
true
然后您可以调用
showPauseText()


希望有帮助:)

我相信你的问题在于设置
self.view?.paused=true
,正如@Steve在评论中和@Linus G.在回答中指出的那样。因此,当您试图取消隐藏标签时,由于视图已暂停,因此没有发生任何事情

我尝试使用
self.paused
来暂停
SKScene
。这解决了显示标签的问题,但实际上并没有暂停场景。这可能是因为:自iOS8以来,SpriteKit在进入后台时自动暂停游戏,在进入前台时取消暂停游戏。因此,尝试使用
applicationWillResignActive
设置
self.paused=true
,没有效果,因为它在进入前景时未暂停

要解决此问题,您可以观察
UIApplicationWillResignActiveNotification
。然后,当应用程序将退出活动状态时,您可以设置
self.speed=0
,这与暂停
SKScene
的效果相同。这将显示标签并根据需要暂停场景

例如:

class GameScene: SKScene {
    let tapToResume = SKLabelNode(fontNamed: "Noteworthy")

    override func didMoveToView(view: SKView) {
        NSNotificationCenter.defaultCenter().addObserver(self, 
                             selector: Selector("pauseScene"), 
                             name: UIApplicationWillResignActiveNotification, 
                             object: nil)

        tapToResume.text = "tap to resume"
        tapToResume.position = CGPoint(x: frame.midX, y: frame.midY)
        tapToResume.fontSize = 55
        tapToResume.hidden = true
        self.addChild(tapToResume)
}

func pauseScene() {
    self.speed = 0.0
    tapToResume.hidden = false
}

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
    // Check the label was pressed here.
    if labelWasPressed {
        self.speed = 1.0
        tapToResume.hidden = true
    }
}
class游戏场景:SKScene{
让tapToResume=SKLabelNode(FontName:“值得注意”)
覆盖func didMoveToView(视图:SKView){
NSNotificationCenter.defaultCenter().addObserver(self,
选择器:选择器(“暂停”),
名称:UIApplicationWillResignActivification,
对象:无)
tapToResume.text=“点击继续”
tapToResume.position=CGPoint(x:frame.midX,y:frame.midY)
tapToResume.fontSize=55
tapToResume.hidden=true
self.addChild(tapToResume)
}
func pauseScene(){
自身速度=0.0
tapToResume.hidden=false
}
覆盖func touchesBegined(触摸:设置,withEvent事件:UIEvent){
//检查标签是否压在这里。
如果标签被按下{
自身速度=1.0
tapToResume.hidden=true
}
}
所以我“黑了”我的解决方案在这里。由于ABakerSmith建议设置
self.speed=0.0
,操作暂停,我的标签将出现,但
physicsWorld
仍处于活动状态。因此,我的解决方案是在应用程序返回后设置
self.speed=0.0
self.physicsWorld.speed=0.0
在非活动状态下,我只需重置
self.speed=1.0
self.physicsWorld.speed=1.0
。我确信有其他解决方案可以解决这个难题,但由于SpriteKit已经处理中断,我真正需要做的就是暂停操作和物理

斯威夫特
您是否应该设置
SKLabelNode
text
属性?或者您只是没有在上面的代码中包含该位?抱歉,代码在那里,只是忘记添加了它。您是否在暂停视图之前调用showPauseText?看起来您是先暂停,然后尝试取消隐藏文本。我只是尝试切换它们,然后调用首先显示文本,但文本仍然没有显示。可能是您的
fontname
参数(当您声明标签时)传递给它的字体名称不正确,或者可能是因为z索引较低,标签隐藏在另一个精灵后面?嗨,Linus,我移动了我的
showPauseText()
函数到AppDelegate函数这样,当应用程序从非活动状态返回时,它会显示文本。但仍然不走运。我已在原始帖子中更新了代码以反映更改,并添加了终端输出。忽略上述内容。嗨,Linus,我对代码做了一些更改,并按照您的建议放回了打印语句。标签仍然不是b正在显示,但您可以看到它正在被调用。感谢您的建议。虽然这确实允许在应用程序进入非活动状态时取消隐藏“点击恢复”标签,并允许我在返回并单击标签时隐藏标签,但我的“flappy bird”(实际上是Kirby,一个童年的最爱)
class GameScene: SKScene, SKPhysicsContactDelegate {
    ...
    let tapToResume = SKLabelNode(fontNamed: "Noteworthy")
    ...
    override func didMoveToView(view: SKView) {
        ...
        NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("pauseGameScene"), name: "PauseGameScene", object: nil)
        NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("showPauseText"), name: "ShowPauseText", object: nil)

        tapToResume.text = "tap to resume"
        tapToResume.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame))
        tapToResume.fontSize = 55
        tapToResume.hidden = true
        self.addChild(tapToResume)
        ...
    }

    func pauseGameScene() {
        println("pause game")
        self.view?.paused = true
    }

    func showPauseText() {
        if self.view?.paused == true {
            tapToResume.hidden = false
            println("show text")
        }
    }

    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
        ...
        if self.paused {
            self.view?.paused = false
            if tapToResume.hidden == false {
                tapToResume.hidden = true
            }
        }
    }
    ...
}
class GameScene: SKScene {
    let tapToResume = SKLabelNode(fontNamed: "Noteworthy")

    override func didMoveToView(view: SKView) {
        NSNotificationCenter.defaultCenter().addObserver(self, 
                             selector: Selector("pauseScene"), 
                             name: UIApplicationWillResignActiveNotification, 
                             object: nil)

        tapToResume.text = "tap to resume"
        tapToResume.position = CGPoint(x: frame.midX, y: frame.midY)
        tapToResume.fontSize = 55
        tapToResume.hidden = true
        self.addChild(tapToResume)
}

func pauseScene() {
    self.speed = 0.0
    tapToResume.hidden = false
}

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
    // Check the label was pressed here.
    if labelWasPressed {
        self.speed = 1.0
        tapToResume.hidden = true
    }
}
class GameScene: SKScene, SKPhysicsContactDelegate {
    let tapToResume = SKLabelNode(fontNamed: "Noteworthy")
    ...

    override func didMoveToView(view: SKView) {
        ...
        NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("pauseGameScene"), name: "PauseGameScene", object: nil)
        NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("showPauseText"), name: "ShowPauseText", object: nil)
    }

    func pauseGameScene() {
        self.physicsWorld.speed = 0.0
        self.speed = 0.0
    }

    func showPauseText() {
        if self.physicsWorld.speed == 0.0 {
        tapToResume.hidden = false
        }
    }

    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
        ...
        if self.physicsWorld.speed == 0.0 {
            self.physicsWorld.speed = 1.0
            self.speed = 1.0
            if tapToResume.hidden == false {
                tapToResume.hidden = true
            }
        }
    }

    ...
}
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    func applicationWillResignActive(application: UIApplication) {
    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
    // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
    NSNotificationCenter.defaultCenter().postNotificationName("PauseGameScene", object: self)
    NSNotificationCenter.defaultCenter().postNotificationName("ShowPauseText", object: self)
    }
    ...
}