Sprite Kit 创建倒计时问题

Posted

技术标签:

【中文标题】Sprite Kit 创建倒计时问题【英文标题】:Sprite Kit creating count down timer issues 【发布时间】:2015-07-26 13:52:19 【问题描述】:

timeLabel 应该从 60 倒计时到 0,但我还没有实现持续时间。例如timeLabel.text = String(i) //implement every 1 second 这样它就会像一个真正的倒计时计时器。我该怎么做。另一个问题是运行此代码时游戏不会在模拟器中启动。我收到一个错误,我被重定向到 AppDelegate.swift 文件:class AppDelegate: UIResponder, UIApplicationDelegate //error: Thread 1: signal SIGABRT

class GameScene: SKScene 

var timeLabel = SKLabelNode()

override func didMoveToView(view: SKView)    

    for var i = 60; i > 0; i-- 

        timeLabel.text = String(i)
        timeLabel.position = CGPointMake(frame.midX, frame.midY)
        timeLabel.fontColor = UIColor.blackColor()
        timeLabel.fontSize = 70
        timeLabel.fontName = "Helvetica"
        self.addChild(timeLabel)

    

  


【问题讨论】:

【参考方案1】:

您可以通过多种方式做到这一点,这里有一个关于如何使用 SKAction 更新标签文本(计数器)的示例:

  import SpriteKit

  class GameScene: SKScene 

    let timeLabel = SKLabelNode(fontNamed: "Geneva")
    var counter = 60

    override func didMoveToView(view: SKView) 

        timeLabel.text = "60"
        timeLabel.position = CGPointMake(frame.midX, frame.midY)
        timeLabel.fontColor = UIColor.blackColor()
        timeLabel.fontSize = 40

        self.addChild(timeLabel)
    


    func countdown()

        let updateCounter = SKAction.runBlock(

            self.timeLabel.text = "\(self.counter--)"

            if(self.counter == 0)
                self.counter = 60
            

        )



        timeLabel.text = "60"
        timeLabel.position = CGPointMake(frame.midX, frame.midY)
        timeLabel.fontColor = UIColor.blackColor()
        timeLabel.fontSize = 40


        let countdown = SKAction.repeatActionForever(SKAction.sequence([SKAction.waitForDuration(1),updateCounter]))


        //You can run an action with key. Later, if you want to stop the timer, are affect in any way on this action, you can access it by this key
        timeLabel.runAction(countdown, withKey:"countdown")

    

    func stop()

        if(timeLabel.actionForKey("countdown") != nil)


            timeLabel.removeActionForKey("countdown")

        

    


    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) 


        if(timeLabel.actionForKey("countdown") == nil)
            self.countdown()
        

    

  

我在这里所做的是每秒更新标签的文本属性。为此,我创建了一个更新计数器变量的代码块。使用动作序列每秒调用该代码块。

请注意,您当前的代码尝试在每个循环中添加标签。节点只能有一个父节点,并且应用程序会崩溃并显示以下错误消息:

尝试添加一个已经有父节点的 SKNode

此外,您也不会每秒更新一次标签的文本属性。您正在一次执行整个 for 循环(在更短的时间内完成)。

【讨论】:

我必须移动和/或添加哪些代码才能在用户点击屏幕时开始倒计时。因此,当游戏运行时,倒计时在用户点击屏幕之前什么都不做。我一直在尝试使用override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) ,但似乎无法正常工作。 @MilesMilitis 您可以通过在 touches started 方法中启动一个动作来做到这一点。您可以检查编辑。 if(timeLabel.actionForKey("countdown") == nil) self.countdown() 我收到错误:GameScene 没有名为 countdown 的成员 @MilesMilitis 实际上它对我有用......它可能与 Swift 版本有关(你的 Swift 版本可能比我的更新 :) 无论如何,你可以使用相同的逻辑,只需修改 Swift遵循 Swift 版本标准的代码。重要的是在 touchesBegan 内部而不是在 didMoveToView 方法内部开始一个动作。 我的错是一些代码设置不当。我们现在可能使用的是相同的 swift 版本。

以上是关于Sprite Kit 创建倒计时问题的主要内容,如果未能解决你的问题,请参考以下文章

Sprite Kit 调用随机方法

信号-计时器例子

如何使用 Sprite Kit 创建具有 3D 效果的戒指?

Sprite Kit SKShapeNode 创建两个节点而不是一个

在 Sprite Kit 中为迷宫创建物理体的最佳方法?

背景图像大小 Sprite Kit 游戏