Ios 如何在swift中进行倒计时或倒计时?
我正在做一个2d平台游戏,我需要的是一个计数计时器,也就是一个进度条或一个进度计数节点。它应该像倒计时一样工作,只是应该从0开始,然后无限地向上。我将根据这个数字的高低来确定游戏的速度/难度。我知道要问问题,所以你们应该总是提供一些代码,但我知道如何倒计时的线索。现在有人知道如何创建下面的屏幕截图中所示的东西了吗 编辑 我已经设法实现了我想要的。我刚刚创建了一个SKLabelNode,它有一个int变量作为文本,并且在update方法中增加了int变量,比如score++。但是分数标签的价值增长得非常快,有人知道如何让它慢一点,然后在一段时间后,随着游戏的深入,让它慢慢变快吗 先谢谢你Ios 如何在swift中进行倒计时或倒计时?,ios,swift,sprite-kit,progress-bar,countdown,Ios,Swift,Sprite Kit,Progress Bar,Countdown,我正在做一个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”,那么当玩家恢复游戏时,倒计时的值与暂停状态之前的值相同,这一点很重要,这样游戏速度保持不变,你就有点离题了。你原来的问题得到了回答。如果你有不同的问题,请随便问一个新问题,希望有人会回答。简言之,当玩家暂停游戏时,等待动作的持续时间参数值与之前相同。你为什么认为会有变化?另外,你们真的应该问一个新问题,因为我们要讨论另外一个话题。祝你的比赛好运!哦,是的,对不起,你说得对!我把速度值和等待动作/持续时间值弄错了。不管怎样,我对这个话题再也没有问题了。你真是个了不起的家伙,我希望我能不止一次投票给你答案:-)谢谢!