一、问题
在做连连看的时候需要加一个计时器的动画,这样就完成了计时功能的设计。
二、解决
主要思路:
1、先产生一个画布,用深颜色填充满。
2、产生一个新的矩阵用来覆盖画布,背景用白色,就可以渲染出来递减的感觉
3、动态改变填充的位置,就完成增加和减少时间的动画效果
1 # 时间画布、动画
2 self.time_counter = tk.Canvas(self.root, width=22, height=180, bg="yellow")
3 self.time_counter.place(x=615, y=80)
4
5 # 时间显示
6 self.show_time = tk.Label(self.root, bg="lightgrey", fg="purple", font="叶根友毛笔行书2.0版 15 bold", text=f"剩余时间\n{self.__time}s")
7 self.show_time.place(x=590, y=20)
8
9 # 计时函数
10 def counter(self):
11 """
12 计时柱的构建
13 :return:
14 """
15 try:
16 fill_line = self.time_counter.create_rectangle(1.5, 1.5, 23, 0, width=0, fill="white")
17 while self.__cycle >= 0: # self.time 做循环量处理
18 self.n += self.__scalar
19 # 移动开始减少
20 self.time_counter.coords(fill_line, (0, 0, 80, self.n))
21 self.root.update()
22 self.__time -= 1
23 self.show_time.configure(text=f"剩余时间\n{self.__time}s", fg="purple")
24 time.sleep(1.0) # 控制进度条流动的速度 1秒一次
25 # 时间结束 游戏结束 退出
26 if self.__time == 0:
27 tk.messagebox.showinfo("Tip", f"最后分数:{self.__score}")
28 self.__game_start = False
29 exit()
30 self.__cycle = self.__time # 保证了和时间的一致性
31 except Exception as e:
32 _ = e.__traceback__
33 exit()
34
35 # 需要动态处理
36 def detail(self):
37 """
38 消完之后做加分处理 加时处理
39 :return:
40 """
41 # 加分处理
42 self.__score += self.__score_level * self.__score_base
43 self.show_score.configure(text=f"分数\n{self.__score}", fg="red")
44
45 # 加时处理
46 # 由于一秒一减少 所以self.n的值和self.__time的值一样
47 self.__time += self.__add_time
48 self.n -= self.__scalar * self.__add_time
49 # 将溢出的全部删除
50 if self.__time >= self.__large_time:
51 self.show_time.configure(text=f"剩余时间\n{self.__large_time}s", fg="purple")
52 self.__time = self.__large_time
53 self.n = 0
54 else:
55 self.show_time.configure(text=f"剩余时间\n{self.__time}s", fg="purple")
三、结果呈现
四、总结
1、在使用的过程中,需要考虑循环的一致性,因此要采取while进行循环,而不是for。
2、为了保证在任何情况下都可以使用,因此我用速率来控制增加量
3、对游戏能否继续进行,进行判断不可以退出游戏
五、参考
如何做一个进度条,反过来就是一个时间计时器
GitHub链接:https://github.com/pzq7025/game