我在解决此问题时遇到了麻烦,并且对此感到非常沮丧。
我在游戏场景中有一个暂停按钮和一个非暂停按钮,以允许玩家暂停游戏,以下代码
else if (node == pauseButton) { pauseButton.removeFromParent() addChild(unpauseButton) addChild(restartButton) self.runAction (SKAction.runBlock(self.pauseGame)) } func pauseGame(){ pauseButton.hidden = true unpauseButton.hidden = false scene!.view!.paused = true // to pause the game }
问题
问题是当我暂停游戏然后取消暂停游戏时,我的玩家精灵似乎会自动向前移动两个空格
我还具有点击和滑动手势,当我在屏幕上的任意位置点击时,可以使播放器左右左右移动。
func tapUp(){ let amountToMove:CGFloat = levelUnitHeight let move:SKAction = SKAction.moveByX(0, y: amountToMove, duration: 0.1) menubutton.hidden = true settingsButton.hidden = true highscoreLabel.hidden = true pauseButton.hidden = false thePlayer.runAction(move) } func swipedRight(){ let amountToMove:CGFloat = levelUnitHeight let move:SKAction = SKAction.moveByX(amountToMove, y: 0, duration: 0.1) thePlayer.runAction(move) // links the action with the players }
正如我上面的成员所说,玩家实际上并没有移动2个空格。
另外,您可能应该在暂停游戏时更改策略,因为暂停scene.view使得以后添加SpriteKit元素非常困难。
我认为一种更好的方法是在GameScene中创建一个worldNode并将所有需要暂停的精灵添加到该worldNode中。基本上,您可以更灵活地暂停节点而不是整个场景。
首先创建一个世界节点属性
let worldNode = SKNode()
并将其添加到ViewDidLoad中的场景
addChild(worldNode)
比将您需要暂停的所有精灵添加到worldNode
worldNode.addChild(sprite1) worldNode.addChild(sprite2) ...
为游戏状态创建一个全局枚举
enum GameState { case Playing case Paused case GameOver static var current = GameState.Playing }
比在游戏场景中暂停和恢复功能
func pause() { GameState.current = .Paused // show pause menu etc } func resume() { GameState.current = .Playing self.physicsWorld.speed = 1 worldNode.paused = false }
最后,将实际的暂停代码添加到您的updateMethod中。这样,即使spriteKit本身尝试恢复(例如,重新打开的应用程序,关闭的警报等),它也不会恢复游戏。
override func update(currentTime: CFTimeInterval) { if GameState.current == .Paused { self.physicsWorld.speed = 0 worldNode.paused = true } }
关于tapGesture识别器,在点击之后被调用的方法中,您可以将其添加到其余代码之前
guard GameState.current != .Paused else { return } ....
希望这可以帮助