当前位置: 首页 > 面试题库 >

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

梁丘亦
2023-03-14
问题内容

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

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

 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 }
 ....

希望这可以帮助



 类似资料:
  • 问题内容: 我声明我已阅读有关线程的内容,但从未使用过。所以我问你:) 我有两个线程:和,其中管理GUI和逻辑。 我将从开始。 然后在绘制GUI时,我将其暂停,以等待到达X点的run方法。 当到达X点进入run方法时,我暂停并继续。 并共享一些变量来管理GUI和逻辑… 我可以做吗?如果是,如何?:) 问题答案: 使用和方法: -使当前线程等待,直到另一个线程调用 该对象的方法。 -唤醒正在该对象的

  • 问题内容: 我想暂停Docker容器并稍后再恢复。如何才能做到这一点?通过挂起,我的意思是它应该保存正在进行的过程的状态(例如,视频编码),然后随时将其恢复。 问题答案: 从0.12.0版开始,Docker支持和命令使用cgroup freezer暂停和恢复容器。

  • 暂停脚本的当前线程。 #p::Pause ; 按一次 Win+P 会暂停脚本. 再按一次则取消暂停. Pause [, On|Off|Toggle, OperateOnUnderlyingThread?] 参数 On|Off|Toggle 如果为空或省略, 则它默认为 Toggle. 否则, 请指定下列单词的其中一个: Toggle:如果在当前线程下的潜在线程处于运行状态,则暂停当前线程,否则让潜

  • 我正在使用这个库来实现节点kafka与消费者暂停和恢复方法来处理背压。我已经创建了一个小演示,我可以在其中和,但问题是在后它停止了消费消息。 这是我的代码。 任何人都可以帮助我,我在恢复消费者时做错了什么?当我启动使用者时,它只接收一条消息,并且在恢复后仍然不消耗任何其他消息。

  • 我正在调试一个有很多线程的应用程序。我的断点设置为挂起整个VM。 当一个线程碰到其中一个断点时,我想使用步骤结束。但是这似乎会恢复整个虚拟机,直到该步骤完成。 如果我能单步执行到达断点的单线程,那将非常有帮助。 在IntelliJ 11.1/Java 6中有什么方法可以做到这一点吗?(希望我没有漏掉什么明显的东西……)

  • 我有一个Android应用程序,它使用谷歌admob网络显示间隙广告。admob的优点是,它的活动是独立的。我可以在我的MainActivity中加载广告,只要admob准备好了广告,它就会显示出来,即使我不再在MainActivity中。我已经使用了isLoaded()方法来显示广告,这占了90%的时间。 但其他10%的情况并非如此。有些活动应该保持无广告状态,因为广告会降低游戏质量。如果手机速