本次添加的功能是:屏幕渲染绘制游戏分数、生命数、超级炸弹数以及暂停功能
显示如图所示:
所需资源,其中文字资源font无法上传,莫得办法,可以自己去找一下,也可以下载我上面那个包的连接
然后本次在代码模块只要还是main.py的变化,如果有人从头看到这一步的话,会发现一共:
main.py:渲染各个组件,运行逻辑,等等,这一步添加了渲染分数、超级炸弹数、生命数、暂停功能
bullet.py:主要是子弹的控制,包括子弹各种属性、以及子弹的重置
enemy.py:敌机类,包含敌机的属性、运行、重置等
myplane.py:主要是玩家飞机的控制,包括玩家飞机各种属性、飞机的上下左右移动,以及飞机的重生
supply.py:主要是补给的控制,包括补给的移动以及重置,其实写法都差不多
知识点(建议自己也百度看一下):
1.绘制分数文字,**pygame.font.Font.render()在一个新 Surface 对象上绘制文本
pygame.font.Font.render(text, antialias, color, background=None)
a. text:要显示的文字
b. antialias: 为True时文本图像显示更光滑,为False时文本图像显示有锯齿状
c. color:字体颜色
d. background:背景颜色(可选参数),默认为小黑屏
2.paused_rect.collidepoint(event.pos)
buttons – 一个含有三个数字的元组,三个值分别代表左键、中键和右键,1就是按下了。
pos – 就是位置了……
rel – 代表了现在距离上次产生鼠标事件时的距离
这里直接放上去main.py的代码,其他的代码就在这一步不放上来了,不然会很多(这不能直接放.py文件就很难受),需要的话可以去前面几步查看,或者去那个包里面下载全部的。import pygame
<p>import sys</p>
<p>import traceback</p>
from pygame.locals import </em>
<p>from random import *</p>
<p>import myplane</p>
<p>import enemy</p>
<p>import bullet</p>
<p>import supply</p>
<br><h1>初始化</h1><br>
pygame.init()<br><h1>设置窗口大小</h1><br>
<p>bg_size = width, height = 400, 700 # 实际上是元组</p>
<p>screen = pygame.display.set_mode(bg_size) # 设置窗口</p>
pygame.display.set_caption("飞机大战") # 窗口标题<br><h1>加载背景图片,对于普通图像的显示效果有没有convert都是一样的,但是 使用 convert 可以转换格式,提高 blit 的速度</h1><br>
<p>background = pygame.image.load("images/background.png").convert()</p>
<br><h1>设置黑、绿、红、百几种颜色对应值,后面会用到</h1><br>
<p>BLACK = (0, 0, 0)</p>
<p>GREEN = (0, 255, 0)</p>
<p>RED = (255, 0, 0)</p>
<p>WHITE = (255, 255, 255)</p>
<br><h1>生成敌方小型飞机</h1><br>
<p>def add_small_enemy(small_enemies, enemiesGroup, num):</p>
<p>for i in range(num):</p>
<space99ec1659dce336251162a1fbd4c60303Code 0>
<p>def main():</p>
<p># 创建时钟对象(可以控制游戏循环频率)</p>
<p>clock = pygame.time.Clock()</p>
<p># 生成玩家飞机</p>
<p>me = myplane.MyPlane(bg_size)</p>
<p># 存放所有敌方飞机,这个飞机组包含了小型飞机、中型飞机、大型飞机的各种属性,只要用于处理碰撞</p>
<p># 当程序中有大量的实体的时候,操作这些实体将会是一件相当麻烦的事</p>
<p># 使用pygame.sprite.Group()函数可以创建一个精灵组,从而统一管理,这里创建了一个敌机组</p>
<p>enemiesGroup = pygame.sprite.Group()</p>
<p># 生成地方小型飞机,敌方小型飞机也是一个组,进行统一处理</p>
<p>small_enemies = pygame.sprite.Group()</p>
<p>add_small_enemy(small_enemies, enemiesGroup, 15)</p>
<p># 生成普通子弹,这里是四颗子弹循环</p>
<p>bullet1s = []</p>
<p># 标记发生的哪颗子弹</p>
<p>bullet1s_index = 0</p>
<p># 子弹数目</p>
<p>bullet1_num = 4</p>
<p>for i in range(bullet1_num):</p>
<space99ec1659dce336251162a1fbd4c60303Code 1>
<p># 生成加强子弹,这里是八颗子弹循环,左右各四颗</p>
<p>bulletspro = []</p>
<p># 标记发生的哪颗子弹</p>
<p>bulletspro_index = 0</p>
<p># 子弹数目</p>
<p>bulletspro_num = 8</p>
<p># 左右各压入四颗子弹,//2表示的整除,其实用/2也一样</p>
<p>for i in range(bulletspro_num // 2):</p>
<space99ec1659dce336251162a1fbd4c60303Code 2>
<p># 初始化加强子弹补给,超级炸弹补给</p>
<p>bullet_supply = supply.Bullet_Supply(bg_size)</p>
<p>bomb_supply = supply.Bomb_Supply(bg_size)</p>
<p># 设置无敌时间事件,pygame.USEREVENT代表事件1,pygame.USEREVENT+1代表事件2,以此类推,这里相当于定义了一个事件</p>
<p>invincible_event = pygame.USEREVENT</p>
<p># 设置补给时间事件</p>
<p>bullet_time_supply = pygame.USEREVENT + 1</p>
<p># 设置加强子弹定时器事件,即加强子弹buff持续事件</p>
<p>bulletpro_time = pygame.USEREVENT + 2</p>
<p># 设置定时器,8秒钟发放一次补给</p>
<p>pygame.time.set_timer(bullet_time_supply, 8 * 1000)</p>
<p># 标记是否使用超级子弹</p>
<p>is_double_bullet = False</p>
<p># 玩家三条命</p>
<p>life_num = 3</p>
<p>life_image = pygame.image.load('images/life.png').convert_alpha()</p>
<p>life_rect = life_image.get_rect()</p>
<p># 玩家带有超级炸弹数量</p>
<p>bomb_num = 3</p>
<p># 绘制超级炸弹</p>
<p>bomb_image = pygame.image.load('images/bomb.png').convert_alpha()</p>
<p># 超级炸弹图片位置</p>
<p>bomb_rect = bomb_image.get_rect()</p>
<p># 超级炸弹数量字体</p>
<p>bomb_font = pygame.font.Font('font/font.ttf', 48)</p>
<p># 游戏暂停,默认为非暂停状态</p>
<p>paused = False</p>
<p># 暂停图片</p>
<p>pause_nor_image = pygame.image.load('images/pause_nor.png').convert_alpha()</p>
<p>pause_pressed_image = pygame.image.load('images/pause_pressed.png').convert_alpha()</p>
<p># 继续图片</p>
<p>resume_nor_image = pygame.image.load('images/resume_nor.png').convert_alpha()</p>
<p>resume_pressed_image = pygame.image.load('images/resume_pressed.png').convert_alpha()</p>
<p># 设置默认图片</p>
<p>paused_image = pause_nor_image</p>
<p># 暂停按钮位置</p>
<p>paused_rect = pause_nor_image.get_rect()</p>
<p>paused_rect.left, paused_rect.top = width - paused_rect.width - 10, 10</p>
<p># 控制玩家飞机图片切换,展示突突突的效果</p>
<p>switch_image = True</p>
<p># 切换延时</p>
<p>delay = 100</p>
<p># 游戏分数</p>
<p>score = 0</p>
<p># 设定玩家分数字体样式,从一个字体文件创建一个 Font 对象</p>
<p>score_font = pygame.font.Font('font/font.ttf', 36)</p>
<p># 飞机爆炸的图片下标,依次为小型敌机,中型敌机,大型敌机,玩家飞机的爆炸的图片的下标,切换下标来改变爆炸图片</p>
<p>e1_destory_index = 0</p>
<p>e2_destory_index = 0</p>
<p>e3_destory_index = 0</p>
<p>me_destory_index = 0</p>
<p>running = True</p>
<p>while running:</p>
<space99ec1659dce336251162a1fbd4c60303Code 3>
<p>
<space99ec1659dce336251162a1fbd4c60303Code 4>
</p>
<space99ec1659dce336251162a1fbd4c60303Code 5>
<p>
<space99ec1659dce336251162a1fbd4c60303Code 6>
</p>
<space99ec1659dce336251162a1fbd4c60303Code 7>
<p>
<space99ec1659dce336251162a1fbd4c60303Code 8>
</p>
<space99ec1659dce336251162a1fbd4c60303Code 9>
<p>
<space99ec1659dce336251162a1fbd4c60303Code 10>
</p>
<space99ec1659dce336251162a1fbd4c60303Code 11>
<p>
<space99ec1659dce336251162a1fbd4c60303Code 12>
</p>
<space99ec1659dce336251162a1fbd4c60303Code 13>
<p>
<space99ec1659dce336251162a1fbd4c60303Code 14>
</p>
<space99ec1659dce336251162a1fbd4c60303Code 15>
<p>
<space99ec1659dce336251162a1fbd4c60303Code 16>
</p>
<space99ec1659dce336251162a1fbd4c60303Code 17>
<p>if __name__ == "__main__":</p>
<p>try:</p>
<space99ec1659dce336251162a1fbd4c60303Code 18>
|