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

标签 ios xcode nstimer nstimeinterval

我试图每秒将 Double 变量减少 0.05 以加快函数 spawnEnemy() 的速度,但我找不到有效的方法。所以,我试图在更短的时间内“产生”更多的敌人(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 总是在您启动它们后以相同的时间间隔触发。

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

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

关于ios - 在 swift 中使用递减变量作为 NSTimeInterval,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35375292/

相关文章:

ios - 如何在 IPAD 上安装 ipa 文件

ios - 解决 Storyboard 缺少尾随/前导约束警告

iphone - 使用 NSTimer 显示像汽油泵表一样动画的秒表计时器

ios - 我需要使用单例访问本地数据库的代码审查

ios - Xcode 5.1 + iOS 7.1 上的代码签名损坏

ios - XCode 7 上的 libswiftSecurity.dylib 为 "No such file or directory (2)"

ios - 在 Swift 中使用 NSTimer 的几个小数槽的倒计时

ios - iOS中的数据模型版本编译器(MOMC)错误

ios - 什么决定了 App Store 中应用程序的大小?

ios - 管理作为变量传递的计时器