iOS SpriteKit - 游戏开始前的倒计时?

时间:2016-03-11 14:55:36

标签: ios swift sprite-kit

使用Swift进入iOS上的SpriteKit。我有一个突破'从教程开始游戏,我希望在每次发射球之前实现倒计时,在屏幕中间放置一个SKLabel,从5到1倒计时,然后移开并开始游戏。倒计时正在进行中,您可以看到带有墙壁,固定球等的完整游戏画面。

我无法解决游戏循环中的问题。如果我在didMoveToView(我创建墙并初始化球和桨)的倒计时,我从来没有看到它,但我在日志中看到我的调试消息。我想在呈现SKScene之前调用了didMoveToView。

我尝试使用旗帜第一次调用倒计时功能'更新'被叫,但我再次看到在屏幕上出现任何内容之前执行的倒计时 - 我认为更新'在渲染场景之前最初调用。

我可以实现一个“点击”屏幕来启动'屏幕在另一个SKScene,但我真的想要在屏幕上倒计时,墙壁和(固定)球准备好了。我可以使用游戏画面的背景图像创建这个倒计时场景,但这看起来很尴尬。

感激地收到任何建议,

史蒂夫

2 个答案:

答案 0 :(得分:6)

countdown(5)

结尾处添加了这些功能并致电didMoveToView
func countdown(count: Int) {
    countdownLabel.horizontalAlignmentMode = .Center
    countdownLabel.verticalAlignmentMode = .Baseline
    countdownLabel.position = CGPoint(x: size.width/2, y: size.height*(1/3))
    countdownLabel.fontColor = SKColor.whiteColor()
    countdownLabel.fontSize = size.height / 30
    countdownLabel.zPosition = 100
    countdownLabel.text = "Launching ball in \(count)..."

addChild(countdownLabel)

let counterDecrement = SKAction.sequence([SKAction.waitForDuration(1.0),
    SKAction.runBlock(countdownAction)])

runAction(SKAction.sequence([SKAction.repeatAction(counterDecrement, count: 5),
    SKAction.runBlock(endCountdown)]))

}

func countdownAction() {
    count--
    countdownLabel.text = "Launching ball in \(count)..."
}

func endCountdown() {
    countdownLabel.removeFromParent()
    ball.physicsBody!.applyImpulse(CGVectorMake(20, 20))
}

因此,我创建并设置倒计时的文本,然后创建并运行等待1秒的SKAction,然后递减倒计时并更新标签。它重复了5次,然后移除了倒计时标签,最后给了球一个推动它开始移动的冲动,所以游戏本身可以开始。

似乎工作正常......

答案 1 :(得分:1)

这是NSTimer真正派上用场的地方。 NSTimer基本上每隔一段时间激活一个函数(你指定的频率)。

更新:有时最好不要使用NSTimer;见这里:https://stackoverflow.com/a/24950982/5700898

以下是使用NSTimer的代码示例:

class ViewController: UIViewController {
var countdownTime = 5
var countdownTimer = NSTimer()
// above, setting your timer and countdown time as global variables so they can be accessed in multiple functions.

func PlayerPressesStart() {
countdownTime = 5
countdownTimer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "Countdown", userInfo: nil, repeats: true) // calls the function "Countdown" every second.
}

func Countdown() { // this is the function called by the timer every second, which causes your "countdownTime" to go down by 1. When it reaches 0, it starts the game.
countdownTime--
if countdownTime > 0 {
countdownTimer.invalidate()
placewhereyoudisplaycountdown.text = String(countdownTime)
}
if countdownTime == 0 {
// call the function where game action begins here, or call the function that makes the game begin here.
}
} // closing bracket for the View Controller, don't include this if you're copying and pasting to your already existing View Controller.