飞机大战(项目实战2)
今天详细的讲一下英雄的出场 和位置,我们先定义需求:
1:游戏启动后,英雄出现在屏幕的中间位置,距离屏幕底部120像素
2:英雄每隔0.5秒发射一个子弹,每次连发三枚子弹
3:默认不会移动,需要左/右方向键,控制英雄在水平方向移动
子弹需求:
1:子弹从英雄的正上方沿直线向上方飞行
2:子弹飞出屏幕后需要从精灵租中删除
Hero-----英雄
~初始化方法
·指定英雄图片 , ·定义初始速度 =0(英雄静止不动)
·定义 bullets子弹精灵组保存子弹精灵
`重写 update()方法
`英雄需要水平移动
并且需要保证不能移出屏幕
增加bullets属性,记录所有子弹精灵
增加fire方法,用于发射子弹
Bullet —— 子弹
初始化方法
指定子弹图片
初始速度 = -2—— 子弹需要向上方飞行
重写update()方法
判断是否飞出屏幕,如果是,从精灵组删除
2:创建英雄
2.1 准备英雄类
在plane_sprites新建Hero类
重写初始化方法,直接指定图片名称,并且将初始速度设置为0
设置英雄的初始位置
centerx = x + 0.5 * widthcentery = y + 0.5 * heightbottom = y + heightclass Hero (GameSprite):
"""英雄精灵"""
def__init__(self):
super().__init__("./images/me1.png",0)
# 设置初始位置
self.rect.centerx = SCREEN_RECT.centerx
self.rect.bottom = SCREEN_RECT.bottom -120
2.2 绘制英雄
1:在__create_sprites,添加英雄精灵和英雄精灵组
后续要针对英雄做碰撞检测以及发射子弹
所以英雄需要单独定义成属性
2:在__update_sprites,让英雄精灵组调用update和draw方法
代码实现
修改__create_sprites方法如下:
# 英雄组
self.hero = Hero()
self.hero_group = pygame.sprite.Group(self.hero)
修改__update_sprites方法如下:
self.hero_group.update()
self.hero_group.draw(self.screen)
03. 移动英雄位置
在pygame中针对键盘按键的捕获,有两种方式
第一种方式判断event.type == pygame.KEYDOWN
第二种方式
1:首先使用pygame.key.get_pressed()返回所有按键元组
2:通过键盘常量,判断元组中某一个键是否被按下—— 如果被按下,对应数值为1
提问这两种方式之间有什么区别呢?
第一种方式
elif event.type == pygame.KEYDOWNandevent.key == pygame.K_RIGHT:
print("向右移动...")
第二种方式
# 返回所有按键的元组,如果某个键被按下,对应的值会是1
keys_pressed = pygame.key.get_pressed()
# 判断是否按下了方向键
if keys_pressed [pygame.K_RIGHT]:
print("向右移动...")
结论
第一种方式event.type用户必须要抬起按键才算一次按键事件,操作灵活性会大打折扣
第二种方式用户可以按住方向键不放,就能够实现持续向某一个方向移动了,操作灵活性更好
3.1 移动英雄位置
演练步骤
1.在Hero类中重写update方法
用速度speed和英雄rect.x进行叠加
不需要调用父类方法—— 父类方法只是实现了单纯的垂直运动
2.在__event_handler方法中根据左右方向键设置英雄的速度
向右=>speed = 2
向左=>speed = -2
其他=>speed = 0
代码演练
在Hero类,重写update()方法,根据速度水平移动英雄的飞机
def update (self):
# 飞机水平移动
self.rect.x += self.speed
调整键盘按键代码
# 获取用户按键
keys_pressed = pygame.key.get_pressed()
if keys_pressed[pygame.K_RIGHT]:
self.hero.speed =2
elif keys_pressed[pygame.K_LEFT]:
self.hero.speed =-2
else:
self.hero.speed =0
控制英雄运动边界
在Hero类的update()方法判断英雄是否超出屏幕边界
right = x + width利用rigth属性可以非常容易的针对右侧设置精灵位置
def update(self):
# 飞机水平移动
self.rect.x += self.speed
# 判断屏幕边界
if self.rect.left <0:
self.rect.left =0
if self.rect.right > SCREEN_RECT.right:
self.rect.right = SCREEN_RECT.right
注意:我们在pygame中使用的图片格式为.png格式,如果想要添加自己的图片要注意格式