Python编写微信打飞机小游戏(十一)
如果觉得这篇文章对您有所启发,欢迎关注我的公众号,我会尽可能积极和大家交流,谢谢。
Python编写微信打飞机小游戏(一)
Python编写微信打飞机小游戏(二)
Python编写微信打飞机小游戏(三)
Python编写微信打飞机小游戏(四)
Python编写微信打飞机小游戏(五)
Python编写微信打飞机小游戏(六)
Python编写微信打飞机小游戏(七)
Python编写微信打飞机小游戏(八)
Python编写微信打飞机小游戏(九)
Python编写微信打飞机小游戏(十)
Python编写微信打飞机小游戏(十一)
Python编写微信打飞机小游戏(十二)
在这篇博文中,我们准备为打飞机小游戏添加一个暂停的功能,即用户在游戏过程中随时可以通过单击屏幕右上方的一个暂停按钮来暂停和恢复游戏。这个功能看似比较简单,但其中涉及了鼠标操作、图片切换、代码结构的重置等等,接下来我们一一进行介绍。
1、加载暂停按钮图标
在image文件夹下一共有四张暂停按钮的图片,分别为深色和浅色两组,首先在main()函数中加载相关图片资源并初始化暂停/开始标志位:
paused = False # 标志是否暂停游戏pause_nor_image = pygame.image.load("image/game_pause_nor.png") # 加载暂停相关按钮pause_pressed_image = pygame.image.load("image/game_pause_pressed.png")resume_nor_image = pygame.image.load("image/game_resume_nor.png")resume_pressed_image = pygame.image.load("image/game_resume_pressed.png")paused_rect = pause_nor_image.get_rect()paused_rect.left, paused_rect.top = width - paused_rect.width - 10, 10 # 设置暂停按钮位置paused_image = pause_nor_image # 设置默认显示的暂停按钮
代码看起来有点繁琐,其实每句代码的功能都十分简单。先设置一个暂停/开始标志位“paused”,为true表示暂停状态,为false表示非暂停状态。然后加载四张图片,注意这里四张图片都是由特定含义的,“pause_nor_image”代表未选中状态下的暂停按钮, “pause_pressed_image”代表选中状态下的暂停按钮,“resume_nor_image”代表未选中状态下的开始按钮,“resume_pressed_image”代表选中状态下的开始按钮,鼠标移动到按钮区域按钮就变为选中状态。然后创建一个“paused_image”变量用以保存当前需要显示的按钮图片,游戏开始时默认为“pause_nor_image”。注意这里需要事先得到并设置好按钮图片的区域位置,在接下来的程序中会用到。
2、定义“选中/未选中”状态切换
之前已经说过,选中和未选中状态是由鼠标是否移动到按钮区域来决定的,因此需要定义鼠标移动的事件响应函数,先上代码:
# ====================检测用户的退出及暂停操作====================for event in pygame.event.get(): # 响应用户的偶然操作if event.type == QUIT: # 如果用户按下屏幕上的关闭按钮,触发QUIT事件,程序退出elif event.type == MOUSEMOTION:if paused_rect.collidepoint(event.pos): # 如果鼠标悬停在按钮区域if paused: # r如果当前的状态是暂停paused_image = resume_pressed_imageelse:paused_image = pause_pressed_imageelse:if paused:paused_image = resume_nor_imageelse:paused_image = pause_nor_image
对于鼠标移动事件,每当鼠标指针的位置坐标发生变化时,都会触发一次“MOUSEMOTION”事件,在系统接收到鼠标移动事件后,首先要判断当前鼠标指针是否位于按钮的矩形区域,这个功能可以通过rect类的的collidepoint()成员函数完成,它能够实现判断一个坐标点(例如当前的event.pos)是否在调用者的(一个矩形对象)的区域范围之内。如果鼠标处于按钮区域,则将当前显示的图片指定为“选中状态下的开始/暂停”(resume_pressed_image和pause_pressed_image),否则设定为“非选中状态下的开始/暂停”(resume_nor_image和pause_nor_image),这些小逻辑还是挺磨人的,需要仔细的推敲一把才能理清。
3、定义“暂停/开始”状态切换
程序的暂停/开始时通过鼠标单击的动作来决定的,因此需要编写鼠标单击事件的响应函数,在函数中修改“paused”标志位的值来控制暂停/开始状态的切换:
for event in pygame.event.get(): # 响应用户的偶然操作if event.type == QUIT: # 如果用户按下屏幕上的关闭按钮,触发QUIT事件,程序退出elif event.type == MOUSEBUTTONDOWN:button_down_sound.play()if event.button == 1 and paused_rect.collidepoint(event.pos): # 如果检测到用户在指定按钮区域按下鼠标左键paused = not pausedif paused: # r如果当前的状态是暂停paused_image = resume_pressed_imagepygame.time.set_timer(supply_timer, 0) # 关闭补给机制以及所有音效pygame.mixer.music.pause()pygame.mixer.pause()else:paused_image = pause_pressed_imagepygame.time.set_timer(supply_timer, 30 * 1000) # 开启补给机制以及所有音效pygame.mixer.music.unpause()pygame.mixer.unpause()
简单分析一下这段代码:当鼠标按下时(无论是左键、右键还是中间滚轮)会触发“MOUSEBUTTONDOWN”事件。程序检测到鼠标按下的消息事件后,先播放一声鼠标单击的音效,然后检测按键顺序以及鼠标位置。如果检测到当前为左键单击(event.button == 1)并且鼠标指针位于按钮区域之内(paused_rect.collidepoint(event.pos)返回true),则认为用户发出了有效的暂停指令,此时需要将paused标志位取反。紧接着就需要判断当前状态是暂停还是非暂停,如果单击鼠标之后变为暂停状态(paused为真),则需要关闭补给机制、关闭背景音效、关闭混音器,将按钮图片设置为resume_pressed_image(待开始),让程序静静的等待即可;相反若鼠标单击之后为开始状态,则需要重新开启这些机制,同时调整按钮图片为pause_pressed_image(待暂停)。
4、将paused标志位加入到控制语句
在完成了准备阶段的工作之后,我们开始让paused这个控制标志位真正参与到程序的控制结构中。由于之前在添加“life_num”控制变量的过程中已经对程序结构进行了统一调整,这里的工作就变得相对简单,只需在“life_num”的判断语句之后加上对paused标志位的判断即可:
if life_num and (not paused): # 如果游戏未被暂停,正常运行
对了,差点忘了在while循环内部绘制暂停按钮图标,不过这里绘制操作应该放在“if life_num and (not paused):”判断语句的控制范围之外,以便使得无论程序是否暂停,用户都有图标可以点击:
screen.blit(paused_image, paused_rect)
OK,程序到这里应该能够顺利运行了,在下一篇博客中我们将为游戏添加最后一个功能:GameOver界面的设置。
Python编写微信打飞机小游戏(十一)相关推荐
- Python编写微信打飞机小游戏(三)
如果觉得这篇文章对您有所启发,欢迎关注我的公众号,我会尽可能积极和大家交流,谢谢. Python编写微信打飞机小游戏(一) Python编写微信打飞机小游戏(二) Python编写微信打飞机小游戏(三 ...
- Python编写微信打飞机小游戏(八)
如果觉得这篇文章对您有所启发,欢迎关注我的公众号,我会尽可能积极和大家交流,谢谢. Python编写微信打飞机小游戏(一) Python编写微信打飞机小游戏(二) Python编写微信打飞机小游戏(三 ...
- Python编写微信打飞机小游戏(七)
如果觉得这篇文章对您有所启发,欢迎关注我的公众号,我会尽可能积极和大家交流,谢谢. Python编写微信打飞机小游戏(一) Python编写微信打飞机小游戏(二) Python编写微信打飞机小游戏(三 ...
- Python编写微信打飞机小游戏(十)
如果觉得这篇文章对您有所启发,欢迎关注我的公众号,我会尽可能积极和大家交流,谢谢. Python编写微信打飞机小游戏(一) Python编写微信打飞机小游戏(二) Python编写微信打飞机小游戏(三 ...
- Python编写微信打飞机小游戏(五)
如果觉得这篇文章对您有所启发,欢迎关注我的公众号,我会尽可能积极和大家交流,谢谢. Python编写微信打飞机小游戏(一) Python编写微信打飞机小游戏(二) Python编写微信打飞机小游戏(三 ...
- Python编写微信打飞机小游戏(十二)
如果觉得这篇文章对您有所启发,欢迎关注我的公众号,我会尽可能积极和大家交流,谢谢. Python编写微信打飞机小游戏(一) Python编写微信打飞机小游戏(二) Python编写微信打飞机小游戏(三 ...
- Python编写微信打飞机小游戏(九)
如果觉得这篇文章对您有所启发,欢迎关注我的公众号,我会尽可能积极和大家交流,谢谢. Python编写微信打飞机小游戏(一) Python编写微信打飞机小游戏(二) Python编写微信打飞机小游戏(三 ...
- Python编写人机对战小游戏(抓狐狸)(2)
封面图片:<中学生可以这样学Python>,董付国.应根球著,清华大学出版社 =========== 很久很久以前,在公众号里推送过一个抓狐狸游戏,详见Python编写人机对战小游戏(抓小 ...
- 微信打飞机小游戏的尝试
微信打飞机小游戏的尝试 问题:微信打飞机游戏出现不断跳出的问题 原因:未加return.
最新文章
- java gui 窗口 传值_java – GUI – 在不同窗口之间传输数据(J...
- 简易的c语言编译器,实现简易的C语言编译器(part 8)
- 当人工智能掌管城市,会带来怎样的巨变?
- spring rmi_Spring远程支持和开发RMI服务
- 如何在Java Reflection中的类下获取所有方法信息?
- 【英语学习】【Level 07】U06 First Time L4 Lost in Shanghai
- oracle10gr2安装教程,Solaris10安装Oracle10gR2时的注意事项
- 事务处理笔记《一》ADO.NET级别的事务
- MySQL Mac 终端环境变量配置
- 2021年连云港高考成绩查询,2021年连云港高考状元是谁分数多少分,历年连云港高考状元名单...
- Android端的新浪微博论文,android新浪微博客户端开发毕业论文.doc
- 实现android wifi语音通话功能吗,Android下自写类似系统wifi管理功能的实现
- 解决python 服务端口探测探活
- 大神尝试扒迅雷的代码,竟然被扒了个精光!
- 9月赠书活动名单公布啦!
- 智慧树源码_公众号题库源码
- 在 Lenovo G360 笔记本上安装 Debian Squeeze AMD64
- Snipaste不容易被注意到的小技巧
- 你是真的“C”——宏与函数的英雄本色
- 科技云报道:2022年,产业互联网如何重建安全边界?
热门文章
- 彩票中奖java程序 随机30选7_写一个彩票程序:30选7
- 利用bat命令启动php+nginx环境
- Windows下win32api下载地址
- 【问题解决】kersa ModuleNotFoundError: No module named ‘keras_applications‘ kersa_vggface
- Matlab滤波器的设计
- 解决问题:安装Visio版本冲突(MSI与即点即用)
- 110道Python面试笔试题超强汇总
- 封装 发送socket api遇到的坑(涉及数据格式转换)
- 西工大计算机操作系统实验报告,西工大操作系统实验报告os4.doc
- svn禁止访问“/svn/project/!svn/act解决办法