【作业要求】
写出代码的整体框架
开始之前-精灵类Sprite
子弹类class Bullet
玩家飞机类class Player
敌机类class Enemy
游戏主体循环以及帧率设置
让子弹飞
刷出敌机 打怪
把飞机敌机子弹都画出来
处理键盘事件
分数显示 和 GameOver
最终代码
写出每个类及每个函数的作用
子弹类class Bullet
玩家类class Player
敌机类class Enemy
精灵类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)来设定左上角的位置
pygame.sprite.Sprite是pygame精灵的基类
子弹类继承于pygame.sprite.Sprite, 成员主要是子弹的图片对象和子弹刷出来的位置,当然,还有移动速度。一个方法就是移动,从发出位置直线往屏幕上方移动。
玩家飞机类
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.midtop)
17 self.bullets.add(bullet)
18
19 # 向上移动,需要判断边界
20 def moveUp(self):
21 if self.rect.top <= 0:
22 self.rect.top = 0
23 else:
24 self.rect.top -= self.speed
25
26 # 向下移动,需要判断边界
27 def moveDown(self):
28 if self.rect.top >= SCREEN_HEIGHT - self.rect.height:
29 self.rect.top = SCREEN_HEIGHT - self.rect.height
30 else:
31 self.rect.top += self.speed
32
33 # 向左移动,需要判断边界
34 def moveLeft(self):
35 if self.rect.left <= 0:
36 self.rect.left = 0
37 else:
38 self.rect.left -= self.speed
39
40 # 向右移动,需要判断边界
41 def moveRight(self):
42 if self.rect.left >= SCREEN_WIDTH - self.rect.width:
43 self.rect.left = SCREEN_WIDTH - self.rect.width
44 else:
45 self.rect.left += self.speed
敌机类
1# 敌机类
2class Enemy(pygame.sprite.Sprite):
3 def __init__(self, enemy_img, enemy_down_imgs, init_pos):
4 pygame.sprite.Sprite.__init__(self)
5 self.image = enemy_img #正常的图像
6 self.rect = self.image.get_rect()
7 self.rect.topleft = init_pos
8 self.down_imgs = enemy_down_imgs # 爆炸的图像
9 self.speed = 2
10
11 # 敌机移动,边界判断及删除在游戏主循环里处理
12 def move(self):
13 self.rect.top += self.speed
详细可以参考知乎上的文章https://zhuanlan.zhihu.com/p/39000703
整理代码实现过程中遇到的问题
首先,我是在spyder里打开文件,但运行不了,需要安装pygame
网上显示安装pygame的流程是:python-pip-pygame
我尝试在cmd中安装好pip,这部分比较顺利。
为了安装pygame,我下载了pygame-1.9.6-cp38-cp38m-win_amd64.whl,并且在cmd中运行pip install pygame-1.9.3-cp36-cp36m-win32.whl,但没有效果。
后来,我发现一个比较简单的方法,就是执行pip install pygame
并且wheel 也是这样的方式安装,pip install wheel
这样很方便,不用可以匹配相应版本的pygame 和pip
安装后好,输入python进入交互界面。输入import pygame 然后将文件拖入cmd中即可运行。
或者直接双击py文件就可以运行了。