我试图每秒将 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/