gpt4 book ai didi

ios - Swift:NSTimer 替代品

转载 作者:行者123 更新时间:2023-11-28 09:15:56 25 4
gpt4 key购买 nike

我制作了一个 flappy bird clone,但在尝试实现暂停功能时,我遇到了我的 NSTimer 问题,它正在生成管道。

var timer = NSTimer.scheduledTimerWithTimeInterval(moveSpeed, target: self, selector: Selector("makePipes"), userInfo: nil, repeats: true)

由于 NSTimers 无法暂停,我在 makePipes() 函数中实现了一个简单的 if 语句,检查游戏是否暂停,如果暂停,则不生成新管道。然而,由于在暂停状态期间定时器仍在触发,因此每一系列管道之间的间隔是不一致的。

此外,当从菜单转换到游戏状态时,计时器会关闭时间,快速连续创建前两个管道。

是否有 NSTimer 的替代方案来处理此功能?

最佳答案

您可以在游戏暂停时调用 func invalidate() 停止计时器,然后在游戏未暂停时重新启动它。

更新:

您可以添加第二个定时器,在与下一次触发和暂停时间的差值时触发,第二个定时器应该触发第一个定时器,然后将第一个定时器重置为初始时间。

步骤:

  1. 添加一个每 2 秒触发一次的计时器

  2. 游戏暂停时,根据timer.fireDatetimeOfPause计算时间间隔,应该是intervalTillNextTrigger

  3. 添加第二个 afterPauseTimer,它在 intervallTillNextTrigger 时触发并且不应重复

  4. 当调用afterPauseTimer时,用timer.fire()触发第一个定时器,使timer失效,因为timer.fire() 不会中断它的常规触发计划,再次添加 timer,触发间隔为 2 秒,并使 afterPauseTimer 无效。

    <

见下面的代码:

//
// ViewController.swift
// swft ios
//
// Created by Marius Fanu on 30/12/14.
// Copyright (c) 2014 Marius Fanu. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

var timer: NSTimer!

var isPaused = false
var isAfterPause = false
var intervalTillNextTrigger: NSTimeInterval = 0
var afterPauseTimer: NSTimer!

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.

timer = NSTimer(timeInterval: 2, target: self, selector: Selector("timerTriggerd"), userInfo: nil, repeats: true)
NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSDefaultRunLoopMode)
timer.fire()
}

@IBAction func pauseButtonPressed(sender: UIButton) {
var now = NSDate()
println("now = \(now)")

if isPaused == true {
if isAfterPause {
isAfterPause = false
afterPauseTimer = NSTimer(timeInterval: intervalTillNextTrigger, target: self, selector: Selector("timerAfterIntervalTrigger"), userInfo: nil, repeats: false)
NSRunLoop.mainRunLoop().addTimer(afterPauseTimer, forMode: NSDefaultRunLoopMode)
}

timer = NSTimer(timeInterval: 2, target: self, selector: Selector("timerTriggerd"), userInfo: nil, repeats: true)
NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSDefaultRunLoopMode)
}
else {
isAfterPause = true
intervalTillNextTrigger = timer.fireDate.timeIntervalSinceDate(now)
println("till next trigger \(intervalTillNextTrigger)")
timer.invalidate()
timer = nil
}

isPaused = !isPaused
}

func timerTriggerd() {
NSLog("Triggerd!")
}

func timerAfterIntervalTrigger() {
println("reset timer")
timer.fire()
timer.invalidate()
timer = nil

timer = NSTimer(timeInterval: 2, target: self, selector: Selector("timerTriggerd"), userInfo: nil, repeats: true)
NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSDefaultRunLoopMode)

afterPauseTimer.invalidate()
afterPauseTimer = nil
}

}

关于ios - Swift:NSTimer 替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27701424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com