飞机大战游戏总结
整个项目是在UP主麦叔编程
的视频学习的,加上自己的一些思考和总结。视频,源码和素材的地址在最下方。
项目整个开发流程
效果图
项目需求
实现飞机的左右移动,并发射子弹同时有发射声音。
敌机随机移动
子弹可以击中敌机,并消失,同时有爆炸声音
集中敌机,更新相应的分数
当敌机越过飞机的位置,则游戏结束
项目素材
飞机,敌机,爆炸声,背景图片,背景音乐,子弹,icon,字体
2020/02/20 20:03 235,294 bg.png
2020/02/20 20:03 4,847,674 bg.wav
2020/02/20 20:03 1,057 bullet.png
2020/02/20 20:03 1,597 enemy.png
2020/02/20 20:03 336,406 exp.wav
2021/12/13 00:54 5,059 fly.py
2020/02/20 20:03 34,252 laser.wav
2020/02/20 20:03 2,799 player.png
2021/12/13 00:25 <DIR> ttf
2020/02/20 20:03 1,030 ufo.png
其中ttf是字体文件包,可以在电脑中搜索字体,一般路径是:C:\Windows\Fonts
2018/04/12 07:34 980,756 arialbd.ttf
项目涉及的第三方包
核心包:pygame
需要使用到pygame 的display,mixer,font,event,image
display:显示
mixer:混频器
font:字体
event:事件
image:图片
代码:
#display:显示
pygame.init()
pygame.display.init()
screen = pygame.display.set_mode((800,600))
#mixer:混频器
#加载背景音乐
pygame.mixer.music.load('bg.wav')
#-1循环播放
pygame.mixer.music.play(-1)
#爆炸声音
pung_music = pygame.mixer.Sound('exp.wav')
#播放爆炸的声音
pung_music.play()
#font:字体
score_font =pygame.font.Font('ttf/arialbd.ttf',32)
font =score_font.render(f'Score:{score}',True,(0,255,255))
screen.blit(font,(10,10))
#event:事件
#获取事件
events = pygame.event.get()
for event in events:
#判断事件是否是退出,窗口的X 按钮
if event.type == pygame.QUIT:
print('游戏关闭……')
win_close_flag =False
if event.type == pygame.KEYDOWN:
#print('按下按键……',event)
#<Event(768-KeyDown {'unicode': '', 'key': 1073741903, 'mod': 0, 'scancode': 79, 'window': None})>
if event.key ==pygame.K_RIGHT:
playerStep = 5
elif event.key ==pygame.K_LEFT:
playerStep = -5
elif event.key == pygame.K_SPACE:#按空格键
bullets.append(Bullet(playerx+15,playery-10))
#播放发射的声音
shoot_music.play()
if event.type == pygame.KEYUP:
#print('松开按键……')
playerStep =0
#image:图片
bg_image = pygame.image.load('bg.png')
screen.blit(bg_image,(0,0))
#设置icon
icon = pygame.image.load('ufo.png')
pygame.display.set_icon(icon)
#设置标题
pygame.display.set_caption('飞机大作战')
项目难点
理解pygame的坐标体系:它的坐标体系是左上角为原点(0,0),X轴方向是从左往右,Y轴方向是从上往下
event的理解:事件包括event.type和event.key两个种数据,type是指鼠标移动/按下/松开,按键按下/松开,窗口上方的关闭按钮
X
等等,key是指具体的哪个按键,如:up,down,right,left,A,W,D,S等等边界计算:当一个物体碰到边界时,如果是左边碰到边界,那么计算
物体的x=边界的X
,如果是右边碰到边界,那么是物体的x+物体的宽度 = 边界的x
;同理上方和下方的边界是Y的计算-
计算什么情况下击中敌机
欧几里德(Euclid)定理:
sqrt(x*x + y*y)
计算敌机的坐标与子弹的坐标的距离,这个距离应该小于或等于敌机图片的对角线的长度
如下图:
-
文字的显示
字体的显示和图片的显示是有区别的。图片分为创建,显示,而它分为创建,渲染,显示。
#创建 参数1:字体的相对路径;参数2:字体的大小 font =pygame.font.Font('alix.fft',32) #screen 窗口 screen = pygame.display.set_mode(600,800) #渲染 参数1:文本;参数2:antialias反锯齿显示;参数2:rgb颜色 font_text = font.rander('hello world',True,(255,255,255)) #显示 参数1:文本surface;参数2:显示的坐标 screen.blit(font_text,(20,30))
项目测试点
飞机和敌机是否能移出screen
飞机能否左右移动,并且按键事件能相应
子弹能否击中敌机,发出声音同时分数更新
敌机能否随机移动
游戏是否能结束
从项目中学到了什么
以前学习编程有一个误区,总觉得要一口吃成一个胖子,没有循序渐进的思想,罗马不是一天建成的
,这句话很重要!
在新手学习完基础后,就需要用一个一个的小项目去鼓励自己,别人能做到,自己也能做到。
出来混什么最总要,是义气!
不是,是出来,
那么学习编程什么最重要,是学习!
不!是思考+实践
附件
素材和代码上传至gitee中,仅供学习使用,地址:飞机大战
学习视频地址:麦叔编程飞机大战
注:python版本:3.8以上