飞机大战(项目实战2)

今天详细的讲一下英雄的出场 和位置,我们先定义需求:

1:游戏启动后,英雄出现在屏幕的中间位置,距离屏幕底部120像素

2:英雄每隔0.5秒发射一个子弹,每次连发三枚子弹

3:默认不会移动,需要左/右方向键,控制英雄在水平方向移动


飞机大战(项目实战2)_第1张图片

子弹需求:

1:子弹从英雄的正上方沿直线向上方飞行

2:子弹飞出屏幕后需要从精灵租中删除

Hero-----英雄

~初始化方法

            ·指定英雄图片   ,  ·定义初始速度 =0(英雄静止不动)

·定义 bullets子弹精灵组保存子弹精灵

`重写 update()方法

`英雄需要水平移动

并且需要保证不能移出屏幕

增加bullets属性,记录所有子弹精灵

增加fire方法,用于发射子弹

Bullet —— 子弹

初始化方法

指定子弹图片

初始速度 = -2—— 子弹需要向上方飞行

重写update()方法

判断是否飞出屏幕,如果是,从精灵组删除


2:创建英雄

2.1 准备英雄类

在plane_sprites新建Hero类

重写初始化方法,直接指定图片名称,并且将初始速度设置为0

设置英雄的初始位置


飞机大战(项目实战2)_第2张图片
centerx = x + 0.5 * widthcentery = y + 0.5 * heightbottom = y + height


飞机大战(项目实战2)_第3张图片

class   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()方法判断英雄是否超出屏幕边界

飞机大战(项目实战2)_第4张图片

right = x + width利用rigth属性可以非常容易的针对右侧设置精灵位置


飞机大战(项目实战2)_第5张图片

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格式,如果想要添加自己的图片要注意格式

你可能感兴趣的:(飞机大战(项目实战2))