一尘不染

Sprite暂停后移动了两个位置,然后取消了暂停

swift

我在解决此问题时遇到了麻烦,并且对此感到非常沮丧。

我在游戏场景中有一个暂停按钮和一个非暂停按钮,以允许玩家暂停游戏,以下代码

 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

}

阅读 238

收藏
2020-07-07

共1个答案

一尘不染

正如我上面的成员所说,玩家实际上并没有移动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 }
 ....

希望这可以帮助

2020-07-07