【发布时间】:2016-09-02 01:33:01
【问题描述】:
前段时间我在didBecomeActive 时遇到暂停游戏的问题,然后我找到了一个我认为有效的解决方案,直到现在。
我发现当我离开而不是终止游戏时,iOS会自动暂停我的游戏(全部);当回来(didBecomeActive)时,它会取消暂停。因为我的意思是暂停一个单一层 (gameLayer),所以我创建了一个布尔变量和一个 if 条件来检查我的游戏是否暂停。
如果checkPause == false (not paused) -> 回到游戏时它会调用一个暂停函数(效果很好)(片刻之后?!被系统取消暂停)
如果checkPause == true (paused) -> 它将设置gameLayer.paused = false(系统取消暂停)为true(一旦在离开游戏前暂停)
基本上gameLayer 回来时不会被暂停。看起来 iOS 在 didBecomeActive 函数之后取消暂停我的游戏。
我用下面的代码制作了一个示例项目(它都被注释了,并且是最简单的)
如果需要,可以下载here。
import SpriteKit
class GameScene: SKScene {
//Declarations
var gameLayer = SKNode()
var pauseLayer = SKNode()
var checkPause = Bool() //checkPause == true -> gameLayer is paused | checkPause == false -> gameLayer is not paused
var enemy = SKSpriteNode()
var pauseButton = SKSpriteNode()
var playButton = SKSpriteNode()
//"Cage" objects in the screen
func cageObjects(){
//"caging" every object
let borderBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
borderBody.friction = 0
self.physicsBody = borderBody
}
//Setup
func setupPauseButton(){
//Pause
pauseButton = SKSpriteNode (imageNamed: "pause")
pauseButton.setScale(1)
pauseButton.position = CGPoint(x: self.frame.width / 2, y: self.frame.height / 1.2)
}
func setupPlayButton(){
//Play
playButton = SKSpriteNode (imageNamed: "play")
playButton.setScale(1)
playButton.position = CGPoint(x: self.frame.width / 2, y: self.frame.height / 1.2)
}
func setupEnemy(){
//Enemy
enemy = SKSpriteNode(imageNamed: "enemy")
enemy.position = CGPointMake(self.frame.width / 1, self.frame.height / 2)
enemy.name = "enemy"
enemy.setScale(0.5)
enemy.physicsBody?.affectedByGravity = false
}
//Layers
func createGameLayer(){
//pauseButton
setupPauseButton()
gameLayer.addChild(pauseButton) //add pauseButton to gameLayer
}
func createPauseLayer(){
//playButton
setupPlayButton()
pauseLayer.addChild(playButton) //add playButton to pauseLayer
}
//Spawn
func spawnEnemy(){
//Start spawning, moving and removing
let spawnEnemy = SKAction.runBlock({
() in
//Spawn enemy
self.setupEnemy()
self.gameLayer.addChild(self.enemy)
//Move left and remove when go off screen
let frameWidth = CGFloat(self.frame.width)
let moveEnemy = SKAction.moveByX(-frameWidth - 50, y: 0, duration: NSTimeInterval(0.0028 * frameWidth)) //duration: faster or slower
let removeEnemy = SKAction.removeFromParent()
var moveAndRemove = SKAction()
moveAndRemove = SKAction.sequence([moveEnemy, removeEnemy])
self.enemy.runAction(moveAndRemove)
})
//Spawn enemy each 2 seconds
let spawnEnemyDuration = SKAction.repeatActionForever(SKAction.sequence([spawnEnemy, SKAction.waitForDuration(2.0)]))
gameLayer.runAction(spawnEnemyDuration)
}
override func didMoveToView(view: SKView) {
/* Setup your scene here */
print ("didMoveToView")
registerAppTransitionObservers()
cageObjects()
checkPause = false
createGameLayer()
createPauseLayer()
self.addChild(gameLayer)
spawnEnemy()
}
//Game states
func pauseState(){
//Pause game
pauseButton.hidden = true //hide pauseButton
gameLayer.paused = true //pause gameLayer
checkPause = true //game is paused
self.addChild(pauseLayer) //add pauseLayer
}
func playState(){
pauseLayer.removeFromParent() //remove pauseLayer
//Resume game
checkPause = false //game is not paused
gameLayer.paused = false //unpause gameLayer
pauseButton.hidden = false //show pauseButton
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
/* Called when a touch begins */
//When touch buttons/screen
for touch in touches{
let location = touch.locationInNode(self)
let node = nodeAtPoint(location)
if node == pauseButton{
pauseState()
}
else if node == playButton{
playState()
}
}
}
//Functions from AppDelegate
func registerAppTransitionObservers(){
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(GameScene.applicationDidBecomeActive), name: UIApplicationDidBecomeActiveNotification, object: nil)
}
//Just launched
func applicationDidBecomeActive(){
print("DidBecomeActive")
//gameLayer unpausing problem solving attempt
if checkPause == true{
gameLayer.paused = true
}
//Pause when game is not paused and user leave the screen OR when game is launched
else if checkPause == false{
pauseState()
}
}
}
【问题讨论】:
标签: ios swift sprite-kit