精灵在暂停和取消暂停后移动两个位置
Sprite moves two places after being paused and then unpaused
我在找出解决方案时遇到了麻烦,我开始对此感到非常沮丧。
我的游戏场景中有一个暂停按钮和一个取消暂停按钮,让玩家可以暂停游戏,也就是下面的代码
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 }
....
希望对您有所帮助
我在找出解决方案时遇到了麻烦,我开始对此感到非常沮丧。
我的游戏场景中有一个暂停按钮和一个取消暂停按钮,让玩家可以暂停游戏,也就是下面的代码
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 }
....
希望对您有所帮助