我有一个按钮可以在我的代码上暂停游戏。我想要的是,将游戏与该按钮暂停会发出一条消息,表示"已暂停"出现。但是,由于场景暂停,因此不会显示该消息。
我现在拥有的是SKLabelNode,其开头时alpha值为0.0,当用户暂停游戏时,它会使用fadeInWithDuration()更改为1.0。然后当用户再次按下按钮时,它会使用fadeOutWithDuration()变回0.0。问题是当场景暂停时,带有fadeInWithDuration()的SKAction不会运行。
我怎么能实现这个目标?
答案 0 :(得分:11)
最好的方法,一个Apple也用于#34; DemoBots",就是创建一个暂停而不是场景的世界节点。
创建一个worldNode属性
class GameScene: SKScene {
let worldNode = SKNode()
}
将其添加到didMoveToView
中的场景中addChild(worldNode)
然后将您需要的所有内容添加到worldNode。这包括通常由场景运行的动作(例如,计时器,敌人产卵等)
worldNode.addChild(someNode)
worldNode.run(someSKAction)
比你在暂停功能中说的那样
worldNode.isPaused = true
physicsWorld.speed = 0
和简历
worldNode.isPaused = false
physicsWorld.speed = 1
如果您在暂停时有想要忽略的内容,也可以在更新功能中添加额外的检查。
override func update(_ currentTime: CFTimeInterval) {
guard !worldNode.isPaused else { return }
// your code
}
这样,当您的游戏暂停时,添加暂停的标签或其他用户界面会更容易,因为您实际上并未暂停场景。除非将该操作添加到worldNode或worldNode的子级,否则您还可以运行所需的任何操作。
希望这有帮助
答案 1 :(得分:3)
不是暂停场景,而是可以像这样将
场景中的某些节点分层 SKScene
|--SKNode 1
| |-- ... <--place all scene contents here
|--SKNode 2
| |-- ... <--place all overlay contents here
然后,当您想暂停游戏时,只暂停SKNode 1。
这允许节点SKNode 2继续运行,因此您可以执行诸如动画之类的操作,并且有一个按钮可以为您取消暂停场景,而无需在混合中添加一些非Sprite Kit对象。 / p>
答案 2 :(得分:2)
快速解决方法是在SKLabelNode出现在屏幕上后暂停游戏:
let action = SKAction.fadeOutWithDuration(duration)
runAction(action) {
// Pause your game
}
另一个选择是混合UIKit和SpriteKit并告知ViewController它需要显示这个标签。
class ViewController: UIViewController {
var gameScene: GameScene!
override func viewDidLoad() {
super.viewDidLoad()
gameScene = GameScene(...)
gameScene.sceneDelegate = self
}
}
extension ViewController: GameSceneDelegate {
func gameWasPaused() {
// Show your Label on top of your GameScene
}
}
protocol GameSceneDelegate: class {
func gameWasPaused()
}
class GameScene: SKScene {
weak var sceneDelegate: GameSceneDelegate?
func pauseGame() {
// Pause
// ...
sceneDelegate?.gameWasPaused()
}
}
答案 3 :(得分:1)
所以你想暂停游戏 AFTER 动作执行完毕。
class GameScene: SKScene {
let pauseLabel = SKLabelNode(text: "Paused")
override func didMoveToView(view: SKView) {
pauseLabel.alpha = 0
pauseLabel.position = CGPoint(x: CGRectGetMaxY(self.frame), y: CGRectGetMidY(self.frame))
self.addChild(pauseLabel)
}
func pause(on: Bool) {
switch on {
case true: pauseLabel.runAction(SKAction.fadeInWithDuration(1)) {
self.paused = true
}
case false:
self.paused = false
pauseLabel.runAction(SKAction.fadeOutWithDuration(1))
}
}
}
答案 4 :(得分:0)
我会用
添加标签self.addChild(nameOfLabel)
然后暂停游戏
self.scene?.paused = true
这应该都是在你的代码中触摸了一个if pauseButton。