另一个问题:我调用每次生成精灵的函数。但是当我打断游戏时,例如接听电话或双击主页按钮并转到任务管理器,我的场景不会停止并继续调用此功能(哦,在这个功能中,我记得每个随机时间,导致在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)
}
}
答案 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