如何解决Kotlin:如何通过按下任意三个按钮取消正在进行的计时器,然后重新启动计时器?
Kotlin:如何通过按下任意三个按钮取消正在进行的计时器,然后重新启动计时器?
如果有人能给我一些见解,我将不胜感激。 提前致谢!
背景: 我正在尝试创建一个带有指令(赢!输!平局!)的石头剪刀布游戏!
游戏中有两个计时器,一个主游戏计时器和一个问题计时器。您有 4 秒钟时间根据显示的手和说明选择正确的答案手。
每当问题计时器变为 0 时:
- 计时器将自行重置
- 得到一个“错误”的评估并添加问题总数
- 随机问题(手)和指令(赢!输!平局!)
如果您在计时器用完之前通过点击 choiceRock、choicePaper、choiceScissors 回答:
- 计时器将重新设置并重新倒计时
- 随机问题(手)和指令(赢!输!平局!)
- 评估答案(如果正确,得到 0 / 0 C => 1 / 0 C;如果错误,0 / 0 C => 0 / 1 C)
我已经有了定时器之外的手和指令的随机化功能。 我也已经有了计时器之外的评估功能。 并且计时器工作,并在达到 0 时重新启动。
但是我需要计时器在按下choiceRock、choicePaper、choiceScissors 按钮时正常重启。
================================================ ==========================
如果有人能告诉我,那也将非常有帮助:
-
如何调用定时器内部的randomize函数,而无需在onFinish时重写定时器内部的函数。 (如果你点击只出现在游戏开始的开始按钮,它会调用定时器之外的randomize函数)
-
如何使 onFinish 发生在 1 之后,而不是 0 之后。
我找不到很多关于 Kotlin 计时器的信息......这真的很令人沮丧,我想继续练习新项目。
如果有人能帮助我,我将不胜感激。
问题计时器的代码:
fun startQuestionTimer() {
object : CountDownTimer(4000,1000) {
override fun onTick(millisUntilFinished: Long) {
binding.questionTimer.text = (millisUntilFinished / 1000).toString()
}
override fun onFinish() {
binding.evaluationResult.setImageResource(R.drawable.evaluation_wrong)
totalQuestions ++
binding.correctAnswersCounter.text = "$correctAnswers / $totalQuestions C"
this.start()
fun generateQuestionImage() {
questionImageId = Question().generateQuestionImageId()
when (questionImageId) {
1 -> binding.questionHand.setImageResource(R.drawable.question_rock)
2 -> binding.questionHand.setImageResource(R.drawable.question_paper)
else -> binding.questionHand.setImageResource(R.drawable.question_scissors)
}
}
fun generateQuestionInstruction() {
questionInstructionId = Question().generateQuestionImageId()
when (questionInstructionId) {
1 -> binding.questionInstruction.text = "WIN!"
2 -> binding.questionInstruction.text = "LOSE!"
else -> binding.questionInstruction.text = "GET A DRAW!"
}
}
generateQuestionImage()
generateQuestionInstruction()
}
}.start()
}
choiceRock 按钮的代码:
binding.startButton.setOnClickListener {
binding.startButton.isVisible = false
binding.questionTimer.isVisible = true
startTimer()
startQuestionTimer()
generateQuestionImage()
generateQuestionInstruction()
}
我尝试过的事情:
- 将choiceRock、choicePaper 和choiceScissors 插入计时器内的clicklistener,但不知何故计时器的行为很奇怪。
- 在计时器内使用了 this.cancel(),但计时器只是出现故障。
- 我尝试在 choiceRock 等 onclicklisteners 中取消,但显然它不起作用,因为我无法调用函数上的方法 (startQuestionTimer().cancel())
- 许多其他事情需要花费数小时,但要么冻结计时器,要么让计时器起作用
解决方法
嗨,您可以将计时器分配给一个变量,以便您之后可以访问它。
timer.cancel()
对于上面的代码,我已经将计数器分配给了一个可以在以后重复使用的计时器变量
if (rooms && rooms.length === 0)
return "No Rooms";
else
return rooms.map(room => room.id);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。