系列文章入口
设计思路
游戏暂停功能比较简单,主要是控制gameRunningStatus变量的值与界面的控制统一起来,游戏暂停了,键盘的响应也要停止。另,gameRunningStatus变量的改变也不能直接操作,需生成一个暂停命令单元,送入队列中,由工作任务线程去处理。
具体实现
界面控制
开始按钮会在 “Start”、“Rause”和“Resume”之间切换。
def btnStartClicked(self):
if self.game.getGameRunningStatus() == 0: # 点击时游戏处于未开始状态
self.btnStartVar.set("Pause")
self.game.start()
elif self.game.getGameRunningStatus() == 1: # 点击时游戏处于游戏中
self.btnStartVar.set("Resume")
self.game.pause()
elif self.game.getGameRunningStatus() == 5: # 点击时游戏处于暂停状态
self.btnStartVar.set("Pause")
self.game.resume()
self.gameCanvas.focus_set() # 设置游戏空间为当前活动控件
游戏结束时,恢复初始状态
self.app.setStartButtonText("Start")
暂停操作
def pause(self):
opQueue.put(("pause",5))
恢复操作
游戏处于暂停中,所以直接修改变量值,没有设计命令单元了。
def resume(self):
self.gameRunningStatus = 1
self.canvas.after(self.gameSpeedInterval * (0 if self.isAutoRunning else 1), self.tickoff)
每一个任务单元都是一个二元元组(方便数据解构),第一个是字符串,为命令;第二个是元组,是数据包(也按方便解构的方式去设计),由每个命令自行定义。
工作线程增加暂停处理
...
elif cmd == "pause":
self.gameRunningStatus = data
...
键盘响应改造
def processKeyboardEvent(self, ke):
if self.game.getGameRunningStatus() == 1 and self.game.isAutoRunning == 0:
if ke.keysym == 'Left':
opQueue.put(('Left',()))
...
项目地址
https://gitee.com/zhoutk/ptetris
或
https://github.com/zhoutk/ptetris
运行方法
1. install python3, git
2. git clone https://gitee.com/zhoutk/ptetris (or download and unzip source code)
3. cd ptetris
4. python3 tetris
This project surpport windows, linux, macOs
on linux, you must install tkinter first, use this command:
sudo apt install python3-tk
相关项目
已经实现了C++版,项目地址:
https://gitee.com/zhoutk/qtetris