在 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
}
}
您可以根据需要修改报价率和报价减量,以提供您想要的范围
我试图每秒将 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
}
}
您可以根据需要修改报价率和报价减量,以提供您想要的范围