如果觉得这篇文章对您有所启发,欢迎关注我的公众号,我会尽可能积极和大家交流,谢谢。

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

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

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

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

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

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

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

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

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

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

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

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

  接下来,我们为我方飞机添加武器——发射子弹。

  考虑到Python语言的模块化,我们同样将子弹封装为一个模块,bullet.py。新建py文件,导入Pygame,编程开始。

  1、定义子弹类——Bullet1

  强调这里之所谓命名为Bullet1,是因为游戏中我方飞机射出的子弹是有两种形式,一种是普通子弹,另外一种是超级子弹。其中超级子弹(Bullet2)将在之后的补给发放机制中进行讲解,这里先给出Bullet1类的代码:

# ====================定义普通子弹====================
class Bullet1(pygame.sprite.Sprite):def __init__(self, position):pygame.sprite.Sprite.__init__(self)self.image = pygame.image.load("image/bullet1.png")self.rect = self.image.get_rect()self.rect.left, self.rect.top = positionself.speed = 12self.active = Trueself.mask = pygame.mask.from_surface(self.image)def move(self):if self.rect.top < 0:self.active = Falseelse:self.rect.top -= self.speeddef reset(self, position):self.rect.left, self.rect.top = positionself.active = True

  Bullet1与之前定义的飞机类在结构上很相似,同样都继承至Pygame的精灵类,同样具有active标志位、mask掩膜成员、具有移动函数move()和复位函数reset(),需要注意的有一下几点:1、子弹的速度属性speed要稍微大一点。2、子弹的初始化位置是一个随我方飞机位置变化而变化的量,因此需要在初始化子弹对象时由外部传入(代码中的position,是一个rect类型变量)。3、子弹在屏幕中是自下而上移动的,因此是“-= self.speed”。

  2、在主程序中实例化子弹

  玩过小蜜蜂游戏的同学都知道,这种打飞机类的游戏子弹的发射速度是要比90坦克的炮弹速度快的,严格的说不是速度快,而是频率高。90坦克中我方坦克一次只发射一枚炮弹,在炮弹达到最大射程或者击中敌方坦克之后才能打出下一发炮弹。打飞机则不然,一次只发射一发子弹显然不能应付众多敌机,需要源源不断的发射子弹,落实到程序中也就是需要实例化多个子弹对象并且循环打印,这与之前敌方飞机的初始化方式很像,都是添加多个精灵对象并循环显示,因此我们采用和之前敌机实例化时相类似的机制,首先在main函数的while循环之前创建子弹精灵的索引,然后向其中添加指定数目的子弹:

    # ====================生成普通子弹====================bullet1 = []bullet1_index = 0bullet1_num = 6  # 定义子弹实例化个数for i in range(bullet1_num):bullet1.append(bullet.Bullet1(me.rect.midtop))

  这里通过for循环语句来产生指定数目的子弹对象,并存储于列表结构体中(bullet1),值得注意的一点是,在前面已经提到,在实例化子弹对象时,需要外部传入子弹的初始位置,这里的me.rect.midtop代表的是我方飞机的上方正中间的位置,其实rect结构体还有很多有趣的成员变量来表征其某部分属性,比如说以后我们会用到的rect.center,代表矩形的中心位置,这些知识遇到了再积累吧。

  3、显示子弹及音效

  子弹初始化完成后需要将子弹显示在屏幕上:

            if not (delay % 10):  # 每十帧发射一颗移动的子弹bullet_sound.play()bullets = bullet1bullets[bullet1_index].reset(me.rect.midtop)bullet1_index = (bullet1_index + 1) % bullet1_num

  这部分代码应该放在while循环之内,这里if not (delay % 10)是设置子弹打印的速度,即每十帧绘制一发子弹,delay参数在之前已经详细介绍过,这里不再赘述。在调用子弹对象的reset()成员函数是,即将该对象的active成员变量设置为true,说明该子弹对象已经处于激活状态了。程序编写到这里,如果此时运行程序的话,只能听到发射子弹的声音,并不能看到实际发射的子弹,原因是没有对子弹进行绘制(blit函数)。但这里并不能简单的把子弹绘制到屏幕上,因为我们还要为子弹赋予它的本质功能,击毁敌机,也就是和敌机的碰撞检测。

  4、子弹与敌机的碰撞检测

  在实例化完子弹之后,我们要做的第一件事并不是将子弹显示出来,二是要先检测该发子弹是否击中了敌机,如果击中,就不再显示这发子弹了。因此这里正常的程序设计思路应该是:每一发子弹 -> 该发子弹是否已经激活 -> 如果激活,是否击中敌机 -> 如果没击中,正常绘制子弹图像 -> 如果击中,则子弹损毁,同时敌机损毁,代码如下:

            for b in bullets:if b.active:  # 只有激活的子弹才可能击中敌机b.move()screen.blit(b.image, b.rect)enemies_hit = pygame.sprite.spritecollide(b, enemies, False, pygame.sprite.collide_mask)if enemies_hit:  # 如果子弹击中飞机b.active = False  # 子弹损毁for e in enemies_hit:e.active = False  # 小型敌机损毁

  这里在碰撞检测是,考虑到子弹对象和敌机对象都已经在内部定义了mask(掩膜)成员变量,因此直接调用基于掩膜的的碰撞检测函数即可(详见上篇博文),再次说明碰撞检测函数的返回值(enemise_hit)是一个存放精灵的精灵组结构,通过for()循环遍历其中的元素及确定那个精灵检测到了碰撞。

  ok,程序编写到这里,按道理来说应该能够正常运行,但在这里很可能会出现一个类似于“local variable 'bullets' referenced before assignment”的错误,在这里简单分析一下。错误的意思是bullets变量没有定义,出现这个错误的原因在于我们过早的将delay延时参数进行了减一操作。假如我们将“delay -= 1”这句话放在了while循环的开始位置,delay的初始值为60,进入while循环的一瞬间它就会减为59,这样“if not (delay % 10)”这个条件就不会成立,也就不会执行“bullets = bullet1”,当然也不会播放子弹音效,因此在程序执行到“for b in bullets:”时,由于之前的“bullets = bullet1”操作没有顺利执行,自然bullets参数属于未定义的状态。解决方案也很简单,就是把delay参数的控制代码:

        if delay == 0:delay = 60delay -= 1

移至while循环的末尾,这样程序在进入循环是delay=60,所有代码顺利执行。

  截止到这里,程序顺利运行,我方飞机射出的子弹将敌机一击毙命。当然这里也有不合理的地方,小型敌机可以一击毙命,但中型敌机和大型敌机皮糙肉厚,应该能多挨几发子弹才对,这在之后的博文中会给中型敌机和大型敌机赋予一定血量,并以血槽的形式显示出来。OK,这篇博文就到这里,大家工作顺利。

Python编写微信打飞机小游戏(六)相关推荐

  1. Python编写微信打飞机小游戏(三)

    如果觉得这篇文章对您有所启发,欢迎关注我的公众号,我会尽可能积极和大家交流,谢谢. Python编写微信打飞机小游戏(一) Python编写微信打飞机小游戏(二) Python编写微信打飞机小游戏(三 ...

  2. Python编写微信打飞机小游戏(八)

    如果觉得这篇文章对您有所启发,欢迎关注我的公众号,我会尽可能积极和大家交流,谢谢. Python编写微信打飞机小游戏(一) Python编写微信打飞机小游戏(二) Python编写微信打飞机小游戏(三 ...

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

    如果觉得这篇文章对您有所启发,欢迎关注我的公众号,我会尽可能积极和大家交流,谢谢. Python编写微信打飞机小游戏(一) Python编写微信打飞机小游戏(二) Python编写微信打飞机小游戏(三 ...

  4. Python编写微信打飞机小游戏(七)

    如果觉得这篇文章对您有所启发,欢迎关注我的公众号,我会尽可能积极和大家交流,谢谢. Python编写微信打飞机小游戏(一) Python编写微信打飞机小游戏(二) Python编写微信打飞机小游戏(三 ...

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

    如果觉得这篇文章对您有所启发,欢迎关注我的公众号,我会尽可能积极和大家交流,谢谢. Python编写微信打飞机小游戏(一) Python编写微信打飞机小游戏(二) Python编写微信打飞机小游戏(三 ...

  6. Python编写微信打飞机小游戏(五)

    如果觉得这篇文章对您有所启发,欢迎关注我的公众号,我会尽可能积极和大家交流,谢谢. Python编写微信打飞机小游戏(一) Python编写微信打飞机小游戏(二) Python编写微信打飞机小游戏(三 ...

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

    如果觉得这篇文章对您有所启发,欢迎关注我的公众号,我会尽可能积极和大家交流,谢谢. Python编写微信打飞机小游戏(一) Python编写微信打飞机小游戏(二) Python编写微信打飞机小游戏(三 ...

  8. Python编写微信打飞机小游戏(九)

    如果觉得这篇文章对您有所启发,欢迎关注我的公众号,我会尽可能积极和大家交流,谢谢. Python编写微信打飞机小游戏(一) Python编写微信打飞机小游戏(二) Python编写微信打飞机小游戏(三 ...

  9. Python编写人机对战小游戏(抓狐狸)(2)

    封面图片:<中学生可以这样学Python>,董付国.应根球著,清华大学出版社 =========== 很久很久以前,在公众号里推送过一个抓狐狸游戏,详见Python编写人机对战小游戏(抓小 ...

  10. 微信打飞机小游戏的尝试

    微信打飞机小游戏的尝试 问题:微信打飞机游戏出现不断跳出的问题 原因:未加return. ​

最新文章

  1. Apache Falcon数据集管理和数据处理平台
  2. js获取上传文件内容
  3. 【web安全】Spring Data Commons 1.13.10 SpEL漏洞分析
  4. 堆栈向下增长和向上增长的理解
  5. SAP官方发布的ABAP编程规范
  6. 【转】C#中使用TransactionScope类(分布式事务) 和 锁
  7. 收获,不止SQL优化——抓住SQL的本质--第九章
  8. 什么是灰度发布?灰度发布方式 系统的割接 灰度部署典型的框架架构
  9. koa2从搭建项目到实现API
  10. 毕设题目:Matlab疾病识别与分类
  11. 使用USB转485编程电缆连接西门子 S7-200的软件配置方法以及可能出现的问题
  12. 连接计算机硬盘usb,使用移动硬盘时电脑显示:“如果您将此USB设备连接到高速USB2.0端口,可以提升其性能”...
  13. 怎么修改服务器上的分数,在服务器上设置 WinSAT 分数
  14. 雷军红米手机:以山寨血洗山寨
  15. 解决PyCharm安装tensorflow-cpu2.1.0导入失败问题
  16. 数十万csdn小白难题:自学软件测试,学到什么程度可以出去找工作啊?京东offer不要了,换字节跳动....
  17. Python 标准库之 shutil 高阶文件操作『详细』
  18. 发动机太热 请不要用冷水降温
  19. Python 绘画excel分组柱状图(懒人学习)
  20. 今年云计算的主要趋势,混合云/边缘计算/Serverless

热门文章

  1. java 判断session失效_session过期时间设置和判断session是否过期
  2. CLM 陆面过程模式
  3. 小米路由R1D固件升级后导致Misstar tools插件页面显示错误解决方法
  4. 《离散数学》题库大全及答案
  5. 机器学习_数学基础专题
  6. VMP 虚拟机(加壳原理)
  7. 华为服务器维护宝典,华为交换机在江湖之维护宝典,用户登录教你玩转密码
  8. Windows文件服务器搭建
  9. 软考历年真题以及真题试卷
  10. GameofMir__游戏Mod制作【1】