"Нажмите, чтобы Возобновить" Приостановить текст SpriteKit

Я знаю, что SpriteKit уже обрабатывает паузу в игре, когда приложение переходит в неактивное состояние, но я пытаюсь добавить SKLabelNode "нажмите, чтобы возобновить", когда приложение снова входит в активное состояние. Сейчас он правильно вызывает мои функции и приостанавливает игру, но текст не отображается.

AppDelegate.swift

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.
    println("applicationWillResignActive")
    NSNotificationCenter.defaultCenter().postNotificationName("PauseGameScene", object: self)
    NSNotificationCenter.defaultCenter().postNotificationName("ShowPauseText", object: self)
    ...
}

GameScene.swift

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
            }
        }
    }
    ...
}

РЕДАКТИРОВАТЬ:

Ниже приведен скриншот вывода моего терминала с моими последними изменениями в моем коде выше:

3 ответа

Решение

Так что я "взломал" свое решение здесь. Благодаря 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 уже обрабатывает прерывания, все, что мне действительно нужно было сделать, это приостановить действия и физику.

GameScene.swift

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
            }
        }
    }

    ...
}

AppDelegate.swift

@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)
    }
    ...
}

Я полагаю, что ваша проблема была установка self.view?.paused = true, как было отмечено @Steve в комментарии и @Linus G. в его ответе. Поэтому, когда вы попытались отобразить ярлык, ничего не произошло, потому что представление было приостановлено.

Я пытался с помощью self.paused приостановить SKScene вместо. Это решило проблемы с показом лейбла, но фактически не остановило сцену. Это может быть связано с тем, что: начиная с iOS8, SpriteKit автоматически приостанавливает вашу игру, когда она выходит на задний план, и отменяет ее, когда она выходит на передний план. Поэтому, пытаясь установить self.paused = true, с помощью applicationWillResignActive, не имел никакого эффекта, потому что он был приостановлен при выходе на передний план.

Чтобы решить это вы можете наблюдать 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
    }
}

Я думаю, что у меня есть проблема. Вам следует позвонить pauseGameScene() первый. затем view?.paused является true, Тогда вы можете позвонить showPauseText(),

Надеюсь, это поможет:)

Другие вопросы по тегам