Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在swift中进行倒计时或倒计时?_Ios_Swift_Sprite Kit_Progress Bar_Countdown - Fatal编程技术网

Ios 如何在swift中进行倒计时或倒计时?

Ios 如何在swift中进行倒计时或倒计时?,ios,swift,sprite-kit,progress-bar,countdown,Ios,Swift,Sprite Kit,Progress Bar,Countdown,我正在做一个2d平台游戏,我需要的是一个计数计时器,也就是一个进度条或一个进度计数节点。它应该像倒计时一样工作,只是应该从0开始,然后无限地向上。我将根据这个数字的高低来确定游戏的速度/难度。我知道要问问题,所以你们应该总是提供一些代码,但我知道如何倒计时的线索。现在有人知道如何创建下面的屏幕截图中所示的东西了吗 编辑 我已经设法实现了我想要的。我刚刚创建了一个SKLabelNode,它有一个int变量作为文本,并且在update方法中增加了int变量,比如score++。但是分数标签的价值增长

我正在做一个2d平台游戏,我需要的是一个计数计时器,也就是一个进度条或一个进度计数节点。它应该像倒计时一样工作,只是应该从0开始,然后无限地向上。我将根据这个数字的高低来确定游戏的速度/难度。我知道要问问题,所以你们应该总是提供一些代码,但我知道如何倒计时的线索。现在有人知道如何创建下面的屏幕截图中所示的东西了吗

编辑

我已经设法实现了我想要的。我刚刚创建了一个SKLabelNode,它有一个int变量作为文本,并且在update方法中增加了int变量,比如score++。但是分数标签的价值增长得非常快,有人知道如何让它慢一点,然后在一段时间后,随着游戏的深入,让它慢慢变快吗

先谢谢你


您可以使用NSTimer并每x秒更新一次该值。游戏开始时创建NSTimer

var timer = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: #selector(MyGame.countUp), userInfo: nil, repeats: true)
然后在同一类中创建一个函数,将值向上计数,例如1

func countUp() {
    self.myCountLabel.text == "\(1 + self.myCountLabel.text ?? 0)"
}

也许是这样的:

import SpriteKit

class Player:SKSpriteNode {

    override init(texture: SKTexture?, color: UIColor, size: CGSize) {
        super.init(texture: texture, color: color, size: size)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

class GameScene: SKScene, SKPhysicsContactDelegate {

    var gameStarted = false
    var player = Player(texture: nil, color: UIColor.brownColor(), size: CGSize(width: 50, height: 100))

    var levelTimerLabel = SKLabelNode()
    var levelTimerValue: Int = 0 {
        didSet {

            if levelTimerValue == 10 { self.increaseScore(withDelay: 0.1)}
            levelTimerLabel.text = "\(levelTimerValue)m"
        }
    }

    override func didMoveToView(view: SKView) {

        self.player.position = CGPoint(x: CGRectGetMidX(frame), y: CGRectGetMidY(frame))
        addChild(self.player)

        levelTimerLabel.zPosition = 200
        levelTimerLabel.position = CGPoint(x: CGRectGetMidX(frame), y: CGRectGetMidY(frame))
        levelTimerLabel.text = "\(levelTimerValue)m"
        addChild(levelTimerLabel)
    }

    //MARK: SCORELABEL METHOD
    func increaseScore(withDelay delay:NSTimeInterval = 0.5) {

        let block = SKAction.runBlock({[unowned self] in
            self.levelTimerValue += 1 // Swift 3 yo
        })

        let wait = SKAction.waitForDuration(delay)

        let sequence = SKAction.sequence([wait,block])

        self.runAction(SKAction.repeatActionForever(sequence), withKey: "countUp")

    }
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        if gameStarted == false {

            gameStarted = true
            startWorld()
            increaseScore()
        }
       player.physicsBody?.velocity = CGVectorMake(0, 0)
       player.physicsBody?.applyImpulse(CGVectorMake(0, 150))  // Jump Impulse
    }

    func startWorld(){

        print("startWold method invoked")
    }
}
 func pauseTimer(){

        if let countUpAction = self.actionForKey("countUp") {

            countUpAction.speed = 0.0
        }

    }
取消暂停也一样…只需将
countUpAction.speed
设置为1.0即可 如果你想暂停整个游戏,看看这个问题。看看@Knight0fDragon的答案。这是一种很好的方式,在我看来,这比完全暂停场景或视图更灵活

另外,我建议您使用如下常量,而不是使用字符串“countUp”:

let kCountUpActionKey = "countUp"

因此,在重复使用此操作键时,您将不会出现打字错误。

我将从标签值增加的条件开始。是基于时间(即每30秒值增加一次)还是基于进度?还是完全基于其他原因?@Ollie很抱歉回答晚了,我认为计数计时器是基于进度的。它只是一个上升的SKLabelNode,在某个点之后,它应该上升得更快,因为在SpriteKit中游戏向左滚动得更快(sidescroller)。更合适的方法是使用SKAction或update:method。NSTimer不受视图或场景的暂停状态的影响,因此当用户接到电话或发生其他中断时,自动暂停/取消暂停将不起作用。但是,当某些中断时,您可以使计时器无效。尽管我同意谢谢你回答Yannick,但就像@Whirlwind说NSTimer不受视图状态的影响,所以它不适合我。@Yannick,它变得更复杂,你需要保留已经过去的时间,然后在返回差异时启动计时器,然后重新启动正常计时器,要正确操作非常痛苦。@Whirlwind我查看了你的帖子并试图实现它,我不得不修改一些东西以使其正确工作,从而使其适合我的游戏。如果你不介意的话,我会在几个小时后向你报告,不幸的是,我现在得走了。那太好了!非常感谢:-)如果你不介意的话,我有一个问题,我将在我的游戏中实现暂停状态,如何暂停计数计时器并再次恢复?为什么要创建一个玩家类?再次非常感谢您,我会将您的答案标记为正确。@iCod3r我做了一个编辑,向您展示如何抓住一个特定的动作并暂停它。至于球员级别。。。好吧,我这样做是为了对它进行内部测试,但忘了删除它:)这也很有效,谢谢!只剩下一个简单的问题(我知道我有很多问题,很抱歉),我的倒计时从值“0.15”开始,然后当它达到50米时变为“0.14”,到100米时变为“0.13”,依此类推。我的问题是,如何在比赛中找出计时器的值?因此,如果玩家在200米处暂停游戏,并且倒计时的值为“0.11”,那么当玩家恢复游戏时,倒计时的值与暂停状态之前的值相同,这一点很重要,这样游戏速度保持不变,你就有点离题了。你原来的问题得到了回答。如果你有不同的问题,请随便问一个新问题,希望有人会回答。简言之,当玩家暂停游戏时,等待动作的持续时间参数值与之前相同。你为什么认为会有变化?另外,你们真的应该问一个新问题,因为我们要讨论另外一个话题。祝你的比赛好运!哦,是的,对不起,你说得对!我把速度值和等待动作/持续时间值弄错了。不管怎样,我对这个话题再也没有问题了。你真是个了不起的家伙,我希望我能不止一次投票给你答案:-)谢谢!