为了更加熟练 Tkinter 的应用,决定只用 Tkinter 来写一个游戏,而不是用 Pygame, 在过程中,出了很多很大的问题,最后留了一点已知的问题,不想在花时间去找出来,不过整个程序算跑的没大问题.


1. 游戏要求:

  • 星空中,群星随着宇宙飞船的前进,而相对运动移动
  • 敌机群左右移动再下移,碰到安全线,玩家少一条命;敌机群完全被消灭后提升一关,速度再加快.
  • 玩家按键有左右键可以左右移动,空格键可以发射子弹,长按都可以持续动作,按键 Q 可以随时离开游戏,按键 ESC 可以暂停及恢复游戏的进行.
  •  子弹碰到敌机,两者一起消灭,得到一分.
  •  屏幕中显现关数,分数,以及玩家所剩的生命数
 

2. 程序撰写说明:

  • 星空移动:转换 3D 的星球坐标 (x,y,z)/ 半径 (r) 为 2D 游戏屏幕坐标 (x0,y0)/ 半径 (r0)

factor = x - here
x0 = y/factor
y0 = z/factor
r0 = r/factor
  • 宇宙飞船及敌机

先建立背景可透明的图檔 (.png), 其 alpha 层透明的点值为 0, 这样的图像在背景上移动,才能只显示图像主体,背景的星球移动才不会被遮住。在窗口中就可以随便摆放或移动图像,tkinter 作法为如下:
root = Tk()                                   #建立窗口
canvas = Canvas(root,width=win.width,height=win.height) #在窗口上建立画布
canvas.pack() #摆上画布
im = Image.open('filename.png') #开启图檔
photo = ImageTk.PhotoImage(image=im) #转成PhotoImage物件
Id = canvas.create_image(x, y, image=photo) #放到画布(x,y)位置
#Id则作以后面要作任何动作的依据
canvas.coords(Id, x, y) #移动位置
  • 星球及子弹:

基本上以画圆来表示,左上角坐标 (x0,y0), 右下角坐标 (x1,y1), 填上颜色 color
canvas.create_oval(x0, y0, x1, y1, fill=color) # 画(椭)圆在画布上
canvas.coords(Id, x0, y0, x1, y1) # 更动位置
# 显示及消失: 基本上以canvas.create_image及canvas.create_oval来显示,
# 以canvas.delete(Id)来删除.
  • 多线程控制:

设置多少毫秒以后执行 function, 以下方式就可以起动,并定时执行。必须注意多线程互相之间可能造成问题,尽可能避免,否则出错非常难找到问题所在。除了星球,敌机及子弹的自行运动,按键的重复触发也可以使用,比如系统本身自带的第一次触发会比较慢,或触发的间隔时间不符合要求,也可以多线程的方式自行屏蔽处理.
def function():
pass # do somthing here
root.after(time, function)
root.after(time, function)
  • 碰撞侦测

tkinter 可以找到在某一块区域中所有图像的对象,并以 tag 的方式来区隔所要的对象。在敌机 create_image 及子弹 create_oval 中加入选项 tags=' 标签 ', 我们就可以用 ' 标签 ' 找到子弹与敌机的碰撞,进而消除子弹与敌机.
overlap = canvas.find_overlapping(x0, y0, x1, y1)   # 找到对象列表
overlap[index] in canvas.find_withtag(tag) # 确认带有该标签tag的对象
  • 透明文字:

在画布中的文字是无法透明的,我是以在新建透明图像中,画上文字的方式来达成要求.
font = ImageFont.truetype("filename.ttf", font_size) # 建立字型及其大小
im = Image.new('RGBA', (width, height)) # 建立含有alpha层的空图像
im.putalpha(0) # 设置alpha层的内容都为0(透明)
draw = ImageDraw.Draw(im) #改为ImageDraw物件
draw.text((x,y), text, fill=color, font=font) # 画上文字
image = ImageTk.PhotoImage(im) # 转成PhotoImage物件
Id = canvas.create_image(x, y, image= image) # 放到画布(x,y)位置

3. 其他说明


  • IDE
  • 本来用的的 Pyscripter, 但是在选写程序中,常会出错,而 Tkinter 中的 root.mainloop () 常会造成没有响应无法停止,唯一的方法只有停掉 Pyscripter, 还有在 Pyscripter 中程序执行完,还是会残留在系统中,尤其是 Tkinter, 每次执行的结果都不一样,更糟的是无法执行,因此换了 Spyder, 问题就解决了,不过其侦错的功能就没 Pyscripter 好用,不过反正在 Tkinter 中,其侦错的功能也没用.
  •  在程序撰写过程中,最常碰到的几个问题
     

    程序库:首先,基本上找不到最完整的说明书,再来就是所有的参数没有完全一致的定义或用法,另外就是每个程序库都是别人的一片天地,要搞懂全部的内容真的很难。因此在使用时,定义,用法,功能常会出错,又受限于制定的内容而功能不齐,不时的上网找答案.

     

    逻辑问题:事件处理的先后,方式,常会造成难度或产生不同的问题,比如使用 class, fuction, method 来撰写一个一个的模块,整个流程会更清楚,找起问题也会容易。像这个游戏我大约写了六个版本,最后才定调,其中自然是浪费了很多时间在重写,找问题除错,修改等等.

     

    已知问题:有时候子弹发射会立刻停住,但不影响游戏的进行,子弹没少;还有些 list 的 index 会超出范围,一样不影响游戏的进行.

4. 输出画面

5. 程序说明

以下为完整的程序,分为两部份,一个是游戏常数,避免常要宣告 global, 所以放在另一个档案,便于寻找修改。本来想用 configparser 中的 config.ini 的方式来作变量的宣告,后来觉得又是另一个主题,所以就没有作下去。不过内容仍然保留在主程序 read_configuration () 中;其中还加了表达式功能,改为 a = '@b+c', y 就可以读入处理;另外就是使用 exec (public) 来作 global 宣告,exec (command) 来执行 python 的每一行输入。程序中没有加上任何说明,因为作者累了,哈哈哈哈!请见量,不过使用的变量名已经尽量用来说明该变量的意义.

交流群:887934385 需要源代码请加群获取,免费提供

 

主题: 002.04 Tkinter 星空大战的更多相关文章

  1. 04《UML大战需求分析》之四

    在学习完顺序图之后,流程分析的三种图,我已经学习完了我,但是我还需要大量地锻炼,这样才可以更加熟练地掌握几种图的使用和方法.接下来,我学习了用例图,用来描述系统的行为. 虽然是一同学习的,但是对用例图 ...

  2. [转]50个极好的bootstrap 后台框架主题下载

    50个极好的bootstrap 后台框架主题下载 http://sudasuta.com/bootstrap-admin-templates.html 越来越多的设计师和前端工程师开始用bootstr ...

  3. WordPress免费清新响应式博客/杂志/图片三合一主题Nana

    WordPress免费清新响应式博客/杂志/图片三合一主题Nana 一.主题安装须知 1.本主题必须安装文章点击统计插件:WP-PostViews,可以直接在后台插件→安装插件中直接搜索安装官方最新版 ...

  4. 【转】Ubuntu常用软件合集

    [转]Ubuntu常用软件合集 Ubuntu常用软件合集 我用的使Ubuntu-Kylin14.04,原因呢主要是觉得使本土化的,自带了日历.输入法.优客助手等易于上手的应用.也省的每次安装完原生的系 ...

  5. Python3.x标准模块库目录

    文本 string:通用字符串操作 re:正则表达式操作 difflib:差异计算工具 textwrap:文本填充 unicodedata:Unicode字符数据库 stringprep:互联网字符串 ...

  6. Linux每天一个命令:iperf

    iperf命令 Iperf 是一个网络性能测试工具.Iperf可以测试最大TCP和UDP带宽性能,具有多种参数和UDP特性,可以根据需要调整,可以报告带宽.延迟抖动和数据包丢失.下载地址:https: ...

  7. python基础系列教程——Python3.x标准模块库目录

    python基础系列教程——Python3.x标准模块库目录 文本 string:通用字符串操作 re:正则表达式操作 difflib:差异计算工具 textwrap:文本填充 unicodedata ...

  8. Python3 标准库

    Python3标准库 更详尽:http://blog.csdn.net/jurbo/article/details/52334345 文本 string:通用字符串操作 re:正则表达式操作 diff ...

  9. python 标准库大全

    python 标准库 文本 string:通用字符串操作 re:正则表达式操作 difflib:差异计算工具 textwrap:文本填充 unicodedata:Unicode字符数据库 string ...

随机推荐

  1. T-SQL Part XI: Login Failed 18456 以及修改Authentication Mode

    这是一个很常见的场景,安装SQL Server时候选择了默认的Windows Authentication Only,然后使用中发现还是需要支持用户名/密码登录. 按照MSDN的文档,然而并没有多大作 ...

  2. go 学习笔记之咬文嚼字带你弄清楚 defer 延迟函数

    温故知新不忘延迟基础 A "defer" statement invokes a function whose execution is deferred to the momen ...

  3. SpringSecurity系列之自定义登录验证成功与失败的结果处理

    一.需要自定义登录结果的场景 在我之前的文章中,做过登录验证流程的源码解析.其中比较重要的就是 当我们登录成功的时候,是由AuthenticationSuccessHandler进行登录结果处理,默认 ...

  4. [Error]使用了未经检查或不安全的操作...

    编译错误注: MethodReflect.java使用了未经检查或不安全的操作.注: 有关详细信息, 请使用 -Xlint:unchecked 重新编译. 解决:在类前面加入下面一句解决 @Suppr ...

  5. java编程思想第四版第五章总结

    1. 构造器 构造器的一个重要的作用: 保证对象被使用之前初始化了. 构造器是一种特殊类型的方法, 因为他没有返回值.这与返回值为空(void)明显不同.对于空返回值,尽管方法本身不会自动返回什么, ...

  6. 从0开始学前端(笔记备份)----HTML部分 Day2 HTML表格表单

  7. 自动安装 linux 系统

    实现自动安装 centos 6 和 centos 7 实现自动安装 Linux 系统需要在虚拟机上安装三个服务:apache .tftp.dhcp 三个服务放在一台虚拟机上即可 一.DHCP 服务器的 ...

  8. 优秀的github项目学习

    优秀的github项目学习 后期会陆续添加遇到的优秀项目 https://github.com/chaijunkun

  9. 20191114-2 Beta事后诸葛亮会议

    此作业要求:http://edu.cnblogs.com/campus/nenu/2019fall/homework/10005 组名:扛把子 组长:孙晓宇 组员:宋晓丽.梁梦瑶.韩昊.刘信鹏 扛把子 ...

  10. NN入门,手把手教你用Numpy手撕NN(三)

    NN入门,手把手教你用Numpy手撕NN(3) 这是一篇包含极少数学的CNN入门文章 上篇文章中简单介绍了NN的反向传播,并利用反向传播实现了一个简单的NN,在这篇文章中将介绍一下CNN. CNN C ...