【发布时间】:2019-01-17 23:26:21
【问题描述】:
制作 Yatzee 游戏。我在屏幕上有 5 张图片和一个按钮:
@IBOutlet var button: UIButton!
@IBOutlet var dice1: UIImageView!
@IBOutlet var dice2: UIImageView!
@IBOutlet var dice3: UIImageView!
@IBOutlet var dice4: UIImageView!
@IBOutlet var dice5: UIImageView!
我的资产文件夹中的图像命名为 Dice1.png、Dice2.png 一直到 Dice6.png。
当点击按钮时,Int.random 会选择六个图像中的一个来显示。
@IBAction func button(_ sender: Any) {
dice1.image = UIImage(named: "Dice\(Int.random(in: 1...6))")
dice2.image = UIImage(named: "Dice\(Int.random(in: 1...6))")
dice3.image = UIImage(named: "Dice\(Int.random(in: 1...6))")
dice4.image = UIImage(named: "Dice\(Int.random(in: 1...6))")
dice5.image = UIImage(named: "Dice\(Int.random(in: 1...6))")
}
完美运行!
这是我的问题:
我希望骰子在第一次点击后快速循环显示图像(就像骰子在杯子里摇晃一样),然后当再次点击按钮时,它们应该停止循环(就像它们被滚动一样)。
我想通过使用计时器来做到这一点。按下按钮时,计时器每 0.1 秒触发一次,每 0.1 秒显示不同的图像。
var timer = Timer()
var state = 0
@IBAction func button(_ sender: Any) {
if state == 0 {
Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(roll), userInfo: nil, repeats: true)
button.setTitle("Roll", for: UIControl.State.normal)
state = 1
} else {
timer.invalidate()
button.setTitle("Shake", for: UIControl.State.normal)
state = 0
}
}
@objc func roll() {
dice1.image = UIImage(named: "Dice\(Int.random(in: 1...6))")
dice2.image = UIImage(named: "Dice\(Int.random(in: 1...6))")
dice3.image = UIImage(named: "Dice\(Int.random(in: 1...6))")
dice4.image = UIImage(named: "Dice\(Int.random(in: 1...6))")
dice5.image = UIImage(named: "Dice\(Int.random(in: 1...6))")
}
第一次按下按钮后,骰子都每0.1秒变化一次,看起来很酷,按钮标题变为“滚动”。
当第二次按下按钮时,按钮标题按预期变回“摇动”,但骰子并没有停止,而是以两倍的速度开始改变图像,我认为这意味着计时器再次被调用,而不是 timer.invalidate()
我很困惑,因为每次按下按钮时,标题都会按预期更改,这意味着变量“状态”在 0 和 1 之间正确来回切换。但是,timer.invalidate() 显然不是让骰子停止滚动的方法。
有什么更好的方法来做到这一点?
提前感谢您的帮助!
【问题讨论】: