在 swift 中使用递减变量作为 NSTimeInterval

Using Decreasing Variable as NSTimeInterval in swift

我试图每秒将 Double 变量减少 0.05 以加快函数 spawnEnemy() 的速度,但我找不到有效的方法。所以,我正在尝试在更短的时间内 "spawn" 更多的敌人(UIButtons)。任何帮助都会很棒,非常感谢。谢谢!我下面的代码可以正常编译,但不会加速控制函数 spawnEnemy() 的 NSTimer

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var scoreLabel: UILabel!

    var points: Int = 0

    func randomPoint() -> CGPoint {
        let randomPoint: CGPoint = CGPoint(x:CGFloat(arc4random()%320),y:CGFloat(568-arc4random()%390))
        return randomPoint
    }

    func randomColor() -> UIColor {
        let red = CGFloat(drand48())
        let green = CGFloat(drand48())
        let blue = CGFloat(drand48())
        return UIColor(red: red, green: green, blue: blue, alpha: 1.0)
    }

    func spawnEnemy() {
        let enemy: UIButton = UIButton(frame: CGRect(x: 160, y: 160, width: 100, height: 100))
        enemy.backgroundColor = randomColor()
        enemy.center = randomPoint()
        enemy.addTarget(self, action: Selector("buttonPushed:"), forControlEvents: UIControlEvents.TouchUpInside)
        self.view.addSubview(enemy)
    }

    func buttonPushed(sender : UIButton) {
        if sender.frame.height < 50 || sender.frame.width < 50 {
            sender.frame = CGRectMake(sender.frame.origin.x, sender.frame.origin.y, 50, 50)
            sender.backgroundColor = randomColor()
            sender.center = randomPoint()
            return
        }
        sender.backgroundColor = UIColor.blackColor()
        points = points + 1
        scoreLabel.textAlignment = .Center
        scoreLabel.text = "\(points)"
        scoreLabel.backgroundColor = UIColor.blackColor()
    }
    func decreaseDouble() -> Double {
        var num: Double = 2.0
        num = num - 0.05
        return num
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        NSTimer.scheduledTimerWithTimeInterval(decreaseDouble(), target: self, selector: Selector("spawnEnemy"), userInfo: nil, repeats: true)

        NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("decreaseDouble"), userInfo: nil, repeats: false)

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()

    }

}

下面是我的新代码。任何决赛的事情还是应该这样做?我还添加了一个 while 语句,这样你只能在敌人不是黑色的时候获得分数,否则你可以继续点击敌人生成(但被点击)的地方并继续获得分数。然而,现在当我 运行 应用程序已经产生了两个敌人,但我仍然可以点击它们(只允许获得两点)

    import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var scoreLabel: UILabel!

    var points: Int = 0

    func randomPoint() -> CGPoint {
        let randomPoint: CGPoint = CGPoint(x:CGFloat(arc4random()%320),y:CGFloat(568-arc4random()%390))
        return randomPoint
    }

    func randomColor() -> UIColor {
        let red = CGFloat(drand48())
        let green = CGFloat(drand48())
        let blue = CGFloat(drand48())
        return UIColor(red: red, green: green, blue: blue, alpha: 1.0)
    }

    func spawnEnemy() {
        let enemy: UIButton = UIButton(frame: CGRect(x: 160, y: 160, width: 100, height: 100))
        enemy.backgroundColor = randomColor()
        enemy.center = randomPoint()
        enemy.addTarget(self, action: Selector("buttonPushed:"), forControlEvents: UIControlEvents.TouchUpInside)
        self.view.addSubview(enemy)
    }

    func buttonPushed(sender : UIButton) {
        if sender.frame.height < 50 || sender.frame.width < 50 {
            sender.frame = CGRectMake(sender.frame.origin.x, sender.frame.origin.y, 50, 50)
            sender.backgroundColor = randomColor()
            sender.center = randomPoint()
            return
        }
        while sender.backgroundColor != UIColor.blackColor() {
            points = points + 1
            scoreLabel.textAlignment = .Center
            scoreLabel.text = "\(points)"
            scoreLabel.backgroundColor = UIColor.blackColor()
            sender.backgroundColor = UIColor.blackColor()
        }
        delayTime -= 0.05
    }

    var delayTime: Double = 2.0


    override func viewDidLoad() {
        super.viewDidLoad()

        delayTime = 2.0

        NSTimer.scheduledTimerWithTimeInterval(2.0, target: self, selector: Selector("spawnEnemy"), userInfo: nil, repeats: false)

        NSTimer.scheduledTimerWithTimeInterval(delayTime, target: self, selector: Selector("spawnEnemy"), userInfo: nil, repeats: true)

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()

    }

重复 NSTimers 始终在相同的时间间隔启动它们。

如果你想使用递减间隔而不是重复计时器,我建议使用 single "one-shot" 计时器(不是 2 个计时器)。使用 repeats:false 创建计时器。然后在你的计时器方法中(spawnEnemy,在你的情况下)减少你的时间间隔并使用它来创建一个新的计时器(也使用 repeats:false)使用新的,更短的间隔并调用相同的方法。

您的 decreaseDouble 函数不会像写的那样工作。它总是 return 相同的值 2.0 - 0.05,因为每次调用该函数时您都将 num 设置为 2.0。而是摆脱 decreaseDouble 功能。创建一个实例变量 delayValue 并在您的 viewDidLoad 中为其分配一个值(例如 2.0)。然后每次调用 spawnEnemy 时从中减去 0.05,生成一个新的敌人,并在 delayValue 还没有变得太小的情况下创建一个新的计时器。 (当 delayValue 变得非常小时,你将每秒产生 10 个敌人。最终 delayValue 将变为零,并且计时器间隔不应 <= 0.0。

你的想法是对的。我会将重复计时器用作 'tick',然后保留两个属性 - 一个是滴答计数,另一个是生成新敌人之前的滴答计数。通过减少后者,您可以加快产卵速度。

像这样

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var scoreLabel: UILabel!

    var points: Int = 0

    var tickCount=0    

    var spawnRate=100   // Spawn every 10 seconds to start with

    var spawnTimer:NSTimer!

     override func viewDidLoad() {
        super.viewDidLoad()

        self.tickCount=self.spawnRate

        self.spawnTimer=NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: Selector("tick"), userInfo: nil, repeats: true)

    }

    func tick() {
       if (--tickCount == 0) {
          self.spawnEnemy()
          self.spawnRate=spawnRate - 2  // Change this to determine how quickly the spawn rate increases
          self.tickCount=self.spawnRate
       }
    }

您可以根据需要修改报价率和报价减量,以提供您想要的范围