Ios 游戏中断时暂停场景

Ios 游戏中断时暂停场景,ios,swift,sprite-kit,Ios,Swift,Sprite Kit,另一个问题:我调用每次生成精灵的函数。但当我中断游戏时,例如拿起电话或双击“主页”按钮并转到任务管理器,我的场景不会停止并继续调用该函数(哦,在该函数中,我每次随机调用一次,因为在didMoveToView中它调用一次)。那么,当游戏中断时,如何停止这一场景呢? 谢谢大家! func spawnRocks(){ if gameOver == 0{ score++ scoreLabel.text = "\(score)" let rockPosition = arc

另一个问题:我调用每次生成精灵的函数。但当我中断游戏时,例如拿起电话或双击“主页”按钮并转到任务管理器,我的场景不会停止并继续调用该函数(哦,在该函数中,我每次随机调用一次,因为在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)
 }

}
你可以试试这个主意:

首先,当你的应用程序进入后台时,
applicationIdentinterbackground
将从AppDelegate调用,这样你就可以在那里设置一个带有NSUserDefaults的bool,你可以在你的项目的任何地方访问它,并通过以下方式进行设置:

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

}
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)
        }
    }
}
func applicationWillEnterForeground(application: UIApplication) {
    NSUserDefaults.standardUserDefaults().setBool(false, forKey: "BackGround")
}
现在,在您的
GameViewController.swift
make if false中,当您再次像这样加载游戏时:

override func viewDidLoad() {
    super.viewDidLoad()

    NSUserDefaults.standardUserDefaults().setBool(false, forKey: "BackGround")
}
现在,您可以在函数中读取
NSUserDefaults
,如果布尔值为真,您可以通过以下方式停止它:

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

}
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)
        }
    }
}
func applicationWillEnterForeground(application: UIApplication) {
    NSUserDefaults.standardUserDefaults().setBool(false, forKey: "BackGround")
}
之后,当用户再次从后台打开应用程序时,您可以通过以下方式从AppDelegate再次设置bool false:

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

}
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)
        }
    }
}
func applicationWillEnterForeground(application: UIApplication) {
    NSUserDefaults.standardUserDefaults().setBool(false, forKey: "BackGround")
}

希望它能对您有所帮助。

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


但是,我想问题在于NSTimer不尊重场景或视图的暂停状态。尝试使用动作序列代替延迟和代码块来产生岩石。这应该会有帮助。

最好在重复时使用操作,避免在SpriteKit中使用NSTimer

那么问题是什么呢?我想我应该做一个操作和函数,返回一个节点,一个动作会在DidMoveToViews中永远重复,所以我认为问题出在Ntimer,你可以用这个bool使计时器失效,把它放到其他地方condition@DmitriyVinnichuk您应该避免在SpriteKit中使用NSTimer。我在回答中提到了这一点,但您可以在这里阅读更多内容:更好的方法是使用SKAction或update:method及其currentTime参数。