游戏中断时暂停场景

时间:2015-07-11 11:10:45

标签: ios swift sprite-kit

另一个问题:我调用每次生成精灵的函数。但是当我打断游戏时,例如接听电话或双击主页按钮并转到任务管理器,我的场景不会停止并继续调用此功能(哦,在这个功能中,我记得每个随机时间,导致在didMoveToView中调用一次)。那么当游戏中断时如何停止现场? 谢谢!

func spawnRocks(){

 if gameOver == 0{

    score++
    scoreLabel.text = "\(score)"

    let rockPosition = arc4random() % UInt32(self.frame.height/1.5)
    var rockAmount = CGFloat(rockPosition) - self.frame.size.height/4

    var rockTexture = SKTexture(imageNamed: randomRock())
    rock = SKSpriteNode(texture: rockTexture)

    rock.setScale(randomRockScale())

    rock.position = CGPointMake(CGRectGetMidX(self.frame) + self.frame.size.width, CGRectGetMidY(self.frame) + rockAmount)

    var moveRock = SKAction.moveByX(-self.frame.size.width*2, y: 0, duration: NSTimeInterval(randomRockMove()))
    var removeRock = SKAction.removeFromParent()
    var moveRemoveRock = SKAction.sequence([moveRock, removeRock])
    rock.runAction(moveRemoveRock)
    rockObject.addChild(rock)

    NSTimer.scheduledTimerWithTimeInterval(NSTimeInterval(randomRockSpeed()), target: self, selector: Selector("spawnRocks"), userInfo: nil, repeats: false)
 }

}

3 个答案:

答案 0 :(得分:0)

你可以尝试这个想法:

首先当你的应用程序进入后台applicationDidEnterBackground时,将从AppDelegate调用,这样你就可以在那里设置一个bool,你可以在任何地方访问NSUserDefaults,并按照这种方式设置:

func applicationDidEnterBackground(application: UIApplication) {
    NSUserDefaults.standardUserDefaults().setBool(true, forKey: "BackGround")

}

现在你的GameViewController.swift如果你再次加载你的游戏时会生成错误:

override func viewDidLoad() {
    super.viewDidLoad()

    NSUserDefaults.standardUserDefaults().setBool(false, forKey: "BackGround")
}

现在你可以在你的函数中读到NSUserDefaults,如果你的bool是这样的话你可以阻止它:

func spawnRocks(){

    let backGround = NSUserDefaults().boolForKey("BackGround")
    if !backGround {

        if gameOver == 0{

            score++
            scoreLabel.text = "\(score)"

            let rockPosition = arc4random() % UInt32(self.frame.height/1.5)
            var rockAmount = CGFloat(rockPosition) - self.frame.size.height/4

            var rockTexture = SKTexture(imageNamed: randomRock())
            rock = SKSpriteNode(texture: rockTexture)

            rock.setScale(randomRockScale())

            rock.position = CGPointMake(CGRectGetMidX(self.frame) + self.frame.size.width, CGRectGetMidY(self.frame) + rockAmount)

            var moveRock = SKAction.moveByX(-self.frame.size.width*2, y: 0, duration: NSTimeInterval(randomRockMove()))
            var removeRock = SKAction.removeFromParent()
            var moveRemoveRock = SKAction.sequence([moveRock, removeRock])
            rock.runAction(moveRemoveRock)
            rockObject.addChild(rock)

            NSTimer.scheduledTimerWithTimeInterval(NSTimeInterval(randomRockSpeed()), target: self, selector: Selector("spawnRocks"), userInfo: nil, repeats: false)
        }
    }
}

之后,当用户再次从后台打开应用程序时,您可以通过这种方式再次从AppDelegate设置bool false:

func applicationWillEnterForeground(application: UIApplication) {
    NSUserDefaults.standardUserDefaults().setBool(false, forKey: "BackGround")
}

希望它会对你有所帮助。

答案 1 :(得分:0)

iOS 8中的SpriteKit应自动暂停/恢复游戏(当应用程序移至后台或退出后台模式时)。在iOS 7中,您应该手动处理此问题。搜索StackOverflow,有关于此主题的一些答案。搜索aplicationWillResignActive,applicationDidEnterBackground,applicationDidBecomeActive等方法。同时检查视图的paused属性。

但是,我猜这个问题与NSTimer不同,它不尊重场景或观看暂停状态。尝试使用动作序列代替延迟和代码块来产生岩石。这应该会有所帮助。

答案 2 :(得分:0)

更好地使用重复操作并避免在SpriteKit中使用NSTimer