gpt4 book ai didi

iOS 在 doBecomeActive 后取消暂停游戏

转载 作者:行者123 更新时间:2023-11-29 01:00:20 24 4
gpt4 key购买 nike

不久前,我在 didBecomeActive 时遇到了暂停游戏的问题,然后我找到了一个我认为有效的解决方案,直到现在。
我发现当我离开而不是终止游戏时,iOS 会自动暂停我的游戏(所有游戏);返回时 (didBecomeActive),它会取消暂停。由于我的目的是暂停单个层 (gameLayer),因此我创建了一个 bool 变量和一个 if 条件来检查我的游戏是否已暂停。

如果checkPause == false(未暂停)-> 当返回游戏时(不久之后?)它会调用一个暂停函数(效果很好)。 ! 被系统取消暂停)
如果 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()
}
}
}

最佳答案

现在我有了你的消息来源,我明白了你的问题。

您需要保留暂停状态:

class GameScene : SKScene
{
...
override var paused: Bool
{
get{
return super.paused;
}
set{
let value = self.gameLayer.paused
super.paused = newValue;
self.gameLayer.paused = value;

}

}
}

出于某种原因,场景暂停决定取消暂停其下的所有节点

此外,您应该在离开应用程序时暂停游戏,而不是返回应用程序时。

//Functions from AppDelegate
func registerAppTransitionObservers(){
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(GameScene.applicationWillResign), name: UIApplicationWillResignActiveNotification, object: nil)
}

func applicationWillResign(){
print("WillResignActive")
pauseState()
}

您可以删除该检查暂停变量,这是多余的膨胀代码。

关于iOS 在 doBecomeActive 后取消暂停游戏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37081485/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com