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