我知道你们一定想先看效果如何
00 目录
- 整体框架
- 开始之前-精灵类Sprite
- 子弹类class Bullet
- 玩家飞机类class Player
- 敌机类class Enemy
- 游戏主体循环以及帧率设置
- 让子弹飞
- 刷出敌机 打怪
- 把飞机敌机子弹都画出来
- 处理键盘事件
- 分数显示 和 GameOver
- 最终代码
如果你依然在编程的世界里迷茫,可以加入我们的Python学习扣qun:784758214,看看前辈们是如何学习的!交流经验!自己是一名高级python开发工程师,从基础的python脚本到web开发、爬虫、django、数据挖掘等,零基础到项目实战的资料都有整理。送给每一位python的小伙伴!分享一些学习的方法和需要注意的小细节,点击加入我们的 python学习者聚集地
01 前言
这次还是用python的pygame库来做的游戏。关于这个库的内容,读者可以上网了解一下。本文只讲解用到的知识。代码参考自网上,自己也做了一点代码简化。**尽量把最核心的方面用最简单的方式呈现给大家,让大家尽快掌握这个游戏的框架。**至于那些华丽的功能,大家在弄懂了核心知识以后,再去添加也是非常easy的。
02 整体框架
这个游戏设计用到了面向对象的编程思想。 游戏主体划分为三个主要的类:
- 子弹类class Bullet
- 玩家类class Player
- 敌机类class Enemy
在屏幕上可见的也就是这三个东西了。自己的飞机、敌人的飞机、子弹。因此整个游戏的核心就是:
- 把这三个东西的图像呈现在屏幕上。
- 判断和处理子弹撞击敌机和敌机撞击玩家这两种情况。
下面我们会展开为大家一一讲解。
03 开始之前-精灵类Sprite
在下面的代码中,你们会大量见到这个pygame.sprite模块。这里就给大家介绍一下。“sprite”,中文翻译“精灵”,在游戏动画一般是指一个独立运动的画面元素,在pygame中,就可以是一个带有图像(Surface)和大小位置(Rect)的对象。 简单来说是一个会动图片。它的两个成员变量
- self.image=要显示图片的Surface
- self.rect = 显示Surface的区域
对于self.rect,常用的设置rect的方法:**self.rect = self.image.get_rect()。**然后设定self.rect.topleft=(0,0)来设定左上角的位置,从而设定这个精灵在屏幕上的显示位置。精灵特别适合用在OO语言中,比如Python。
pygame.sprite.Sprite是pygame精灵的基类,一般来说,你总是需要写一个自己的精灵类继承一下它然后加入自己的代码。
关于此类的其他函数,咱们用到的时候会详细跟大家说的。
04 子弹类class Bullet
先来看代码吧。
1# 子弹类
2class Bullet(pygame.sprite.Sprite):
3 def __init__(self, bullet_img, init_pos):
4 pygame.sprite.Sprite.__init__(self)
5 self.image = bullet_img
6 self.rect = self.image.get_rect()
7 self.rect.midbottom = init_pos
8 self.speed = 10
9
10 def move(self):
11 self.rect.top -= self.speed
子弹类继承于pygame.sprite.Sprite, 成员主要是子弹的图片对象和子弹刷出来的位置,当然,还有移动速度。一个方法就是移动,从发出位置直线往屏幕上方移动。
05 玩家飞机类class Player
老样子。先看代码
1# 玩家飞机类
2class Player(pygame.sprite.Sprite):
3 def __init__(self, plane_img, player_rect, init_pos):
4 pygame.sprite.Sprite.__init__(self)
5 self.image = [] # 用来存储玩家飞机图片的列表
6 for i in range(len(player_rect)):
7 self.image.append(plane_img.subsurface(player_rect[i]).convert_alpha())
8 self.rect = player_rect[0] # 初始化图片所在的矩形
9 self.rect.topleft = init_pos # 初始化矩形的左上角坐标
10 self.speed = 8 # 初始化玩家飞机速度,这里是一个确定的值
11 self.bullets = pygame.sprite.Group() # 玩家飞机所发射的子弹的集合
12 self.is_hit = False # 玩家是否被击中
13
14 # 发射子弹
15 def shoot(self, bullet_img):
16 bullet = Bullet(bullet_img, self.rect.m