为了更加熟练 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. KDevelop

    ctags+vim还是太累了,还是使用IDE好,尤其是c++模板.KDevelop就不错,符号智能推导以及cmake项目管理和配置,还是挺好用的. Android端的ndk开发使用Android St ...

  2. SpringSecurity退出功能实现的正确方式

    本文将介绍在Spring Security框架下如何实现用户的"退出"logout的功能.其实这是一个非常简单的功能,我见过很多的程序员在使用了Spring Security之后, ...

  3. LinearLayout适配不同机型技巧

    <View android:layout_width="match_parent" android:layout_height="0dp" android ...

  4. Git及Github

    目录 Git及Github的使用 Git的基本介绍 Git命令行操作 1.设置签名 2.创建本地库 3.仓库初始化 4.状态查看 5.添加文件 6.提交文件 7.历史记录 8.前进后退 9.删除文件 ...

  5. 新闻实时分析系统 Spark2.X集群运行模式

    1.几种运行模式介绍 Spark几种运行模式: 1)Local 2)Standalone 3)Yarn 4)Mesos 下载IDEA并安装,可以百度一下免费文档. 2.spark Standalone ...

  6. 【Luogu P2146】软件包管理器

    Luogu P2146 由于对于每一个软件包有且只有一个依赖的软件包,且依赖关系不存在环. 很显然这是一个树形的结构. 再看题目要求的操作,安装实际上对应的是覆盖根节点到当前节点的路径,卸载则是覆盖该 ...

  7. Spring IOC 的简单使用

    Spring IOC (Inversion Of Control反转控制容器 一.对于IOC容器的简单理解 在java开发中将程序中的对象交给容器管理,而不是在对象的内部管理. 那么两个简单的问题去分 ...

  8. pymongo的基本操作和使用

    MongoDB简介 MongoDB是一个开源的文档类型数据库,它具有高性能,高可用,可自动收缩的特性.MongoDB能够避免传统的ORM映射从而有助于开发. 文档 在MongoDB中,一行纪录就是一个 ...

  9. Java方法的可变参数

    class Demo { public static int sum(int ... data) { //此处可以传递一个数组,也可以是多个参数 int sum = 0; for (int i : d ...

  10. Linux(CentOS7)修改默认yum源为国内的阿里云、网易yum源

    修改方式: echo 备份当前的yum源 mv /etc/yum.repos.d /etc/yum.repos.d.backup4comex echo 新建空的yum源设置目录 mkdir /etc/ ...