关闭

Python编写微信打飞机小游戏(十一)

标签: 微信打飞机Python
4003人阅读 评论(3) 收藏 举报
分类:

  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_image
                    else:
                        paused_image = pause_pressed_image
                else:
                    if paused:
                        paused_image = resume_nor_image
                    else:
                        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 paused
                    if paused:  # r如果当前的状态是暂停
                        paused_image = resume_pressed_image
                        pygame.time.set_timer(supply_timer, 0)  # 关闭补给机制以及所有音效
                        pygame.mixer.music.pause()
                        pygame.mixer.pause()
                    else:
                        paused_image = pause_pressed_image
                        pygame.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界面的设置。

0
0
查看评论

python趣味入门——写几个常玩的游戏

文档介绍 利用python写“猜数字”,“猜词语”,“谁是卧底”这三个游戏,从而快速掌握python编程的入门知识,包括python语法/列表/元组/字典/流程控制/库函数等等。 环境参数 linux平台,python 3.4。需要在linux中把python 3.4编译一下,这样编写...
  • buptlrw
  • buptlrw
  • 2014-12-14 14:19
  • 15475

如何用Python写一个小游戏(1)

=============================================================第一版:打飞机文字版 思路: 1:主飞机从底层y = 1生成,左右移动 ,每次左右x轴随机移动n个位置,并且移送过的地方每一个位置都会生成一个子弹,并发射。如果此位置Y轴正好...
  • wx1314320tj
  • wx1314320tj
  • 2016-12-08 13:42
  • 838

手把手教你用python写游戏

引言 最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏、后台等方面,python也大放异彩,本篇博文将按照正规的项目开发流程,手把手教大家写个python小游戏,来感受下其中的有趣之处。本次开发的游戏叫做alien invasion。 安装pygame并创建能左右移...
  • u010665216
  • u010665216
  • 2018-01-17 21:41
  • 836

Python编写微信打飞机小游戏(六)

接下来,我们为我方飞机添加武器——发射子弹。   考虑到Python语言的模块化,我们同样将子弹封装为一个模块,bullet.py。新建py文件,导入Pygame,编程开始。   1、定义子弹类——Bullet1   强调这里之所谓命名为Bullet1,是因为游戏中我方飞机射出的子弹是有两种形...
  • u013088062
  • u013088062
  • 2015-11-13 21:34
  • 4274

Python编写微信打飞机小游戏(一)

最近开始学习Python语言,发现Python有一个神奇的Pygame模块,在编写小游戏时显得非常方便,于是参照教学视频编写了一个微信打飞机的小游戏,网上有很多相关的博客,但都不是很详细,大都是直接贴代码,于是决定沉下心来把编写程序的过程记录下来,与大家分享。   首先声明一点,这篇博客完全参照了...
  • u013088062
  • u013088062
  • 2015-11-07 21:13
  • 18744

如何使用Python基于Pygame写一个简易的微信打飞机游戏。

人狠话不多,直接上码: import pygame from pygame.locals import * import time import random """ 需求: 设计一个打飞机游戏,实现的功能如下: 1. 能显示我机,可以通过键盘控制飞机位置,按下s...
  • birdflyinhigh
  • birdflyinhigh
  • 2017-10-03 00:05
  • 630

【python】 类的定义和运用 --附个人做的一个小游戏

#面向对象编程 #定义类 #class 类名(父类): # "类的说明文档"   # 类的定义体(可以定义变量,方法等)   #Object是任何类的(父类/基类/超类) #-----下面是定义一个动物类---- # clas...
  • Hello_Doer
  • Hello_Doer
  • 2016-08-06 17:56
  • 351

Python编写微信打飞机小游戏(十二)

在这篇博客里,我们为游戏添加最后一个功能:GameOver画面的绘制。   在当我方飞机的三条命全部挂掉之后,程序会进入结束程序,我们的设计时当程序结束时显示用户的目前得分以及历史最高分,仅此而已。   1、加载图片资源   在这里我们特意重做了一个游戏结束的画面,其实就是在背景图片上加了一些...
  • u013088062
  • u013088062
  • 2015-11-18 15:18
  • 5927

教自己学Python(三)练手小游戏:不要猜中

不要猜中的小游戏背景和朋友闲待着两个人无聊,都想吃苹果又都不想洗,想起玩过的一个酒桌上猜数字的游戏,然后在手机上写了出来,三局两胜输了去洗苹果…… 游戏介绍0到99(包括边界),随机一个数两人(N人也可以)轮流猜测,如果没猜中,新的数将做为边界,一步步缩小可以猜测的范围,直到猜中为止
  • shadowkael
  • shadowkael
  • 2016-07-06 21:43
  • 2027

用Python设计一个经典小游戏

这是关于Python的第9篇文章,介绍如何用Python设计一个经典小游戏:猜大小。 在这个游戏中,将用到前面我介绍过的所有内容:变量的使用、参数传递、函数设计、条件控制和循环等,做个整体的总结和复习。 游戏规则: 初始本金是1000元,默认赔率是1倍,赢了,获得一倍金额,输了,扣除1倍金额。 玩家...
  • bestdwd
  • bestdwd
  • 2017-05-10 14:37
  • 3992
    个人简介
    燕山大学研究生,目前研三。邮箱:1095988845@qq.com,交流请发邮件,评论和私信可能无法及时回复,谢谢。
    个人资料
    • 访问:1588916次
    • 积分:11321
    • 等级:
    • 排名:第1654名
    • 原创:134篇
    • 转载:2篇
    • 译文:0篇
    • 评论:563条
    博客专栏
    最新评论