Python 项目飞机大战- 04 英雄飞机登场

Python 项目飞机大战- 04 英雄飞机登场_第1张图片

目录
一、设计英雄和子弹类
二、创建英雄
2.1 准备英雄类
2.2 绘制英雄
三、移动英雄位置
3.1 移动英雄位置
3.2 控制英雄运动边界
四、发射子弹
4.1 添加发射子弹事件
4.2 定义子弹类
4.3 发射子弹

一、设计英雄和子弹类

英雄需求

  1. 游戏启动后,英雄 出现在屏幕的 水平中间 位置,距离 屏幕底部 120 像素
  2. 英雄 每隔 0.5 秒发射一次子弹
  3. 英雄 默认不会移动,需要通过 左/右 方向键,控制 英雄 在水平方向移动
Python 项目飞机大战- 04 英雄飞机登场_第2张图片
plane_sprites整体结构

子弹需求

  1. 子弹英雄 的正上方发射 沿直线上方 飞行
  2. 飞出屏幕后,需要从 精灵组 中删除

Hero —— 英雄

  • 初始化方法
    • 指定 英雄图片
    • 初始速度 = 0 —— 英雄默认静止不动
    • 定义 bullets 子弹精灵组 保存子弹精灵
  • 重写 update() 方法
    • 英雄需要 水平移动
    • 并且需要保证不能 移出屏幕
  • 增加 bullets 属性,记录所有 子弹精灵
  • 增加 fire 方法,用于发射子弹

Bullet —— 子弹

  • 初始化方法
    • 指定 子弹图片
    • 初始速度 = -2 —— 子弹需要向上方飞行
  • 重写 update() 方法
    • 判断 是否飞出屏幕,如果是,从 精灵组 删除

二、创建英雄

2.1 准备英雄类

  • plane_sprites 新建 Hero
  • 重写 初始化方法,直接指定 图片名称,并且将初始速度设置为 0
  • 设置 英雄的初始位置
class Hero(GameSprite):
    """英雄精灵"""

    def __init__(self):
        # 1.调用父类方法 设置图片和初始化速度
        super().__init__("./images/me1.png",0)
        # 2.设置英雄的初始化位置
        self.rect.centerx = SCREEN_RECT.centerx
        self.rect.bottom = SCREEN_RECT.height - 120

2.2 绘制英雄

  1. __create_sprites,添加 英雄精灵英雄精灵组
    • 后续要针对 英雄碰撞检测 以及 发射子弹
    • 所以 英雄 需要 单独定义成属性
  2. __update_sprites,让 英雄精灵组 调用 updatedraw 方法

代码实现

  • 修改 __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)

三、移动英雄位置

在 pygame 中针对 键盘按键的捕获,有 两种 方式

  • 第一种方式 判断 event.type == pygame.KEYDOWN
  • 第二种方式
    1. 首先使用 pygame.key.get_pressed() 返回 所有按键元组
    2. 通过 键盘常量,判断元组中 某一个键是否被按下 —— 如果被按下,对应数值为 1

*两种方式的区别

  • 第一种方式
 elif event.type == pygame.KEYDOWN and event.key == pygame.K_UP:
        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

3.2 控制英雄运动边界

  • Hero 类的 update() 方法判断 英雄 是否超出 屏幕边界
    def update(self):
        # 英雄在水平方向移动
        self.rect.x += self.speed
        # 控制英雄不能移出屏幕
        if self.rect.x < 0:
            self.rect.x = 0
        elif self.rect.right > SCREEN_RECT.right:
            self.rect.right = SCREEN_RECT.right

四、发射子弹

需求回顾 —— 英雄需求

  1. 游戏启动后,英雄 出现在屏幕的 水平中间 位置,距离 屏幕底部 120 像素
  2. 英雄 每隔 0.5 秒发射一次子弹
  3. 英雄 默认不会移动,需要通过 左/右 方向键,控制 英雄 在水平方向移动

4.1 添加发射子弹事件

pygame定时器 使用套路非常固定:

  1. 定义 定时器常量 —— eventid
  2. 初始化方法 中,调用 set_timer 方法 设置定时器事件
  3. 游戏循环 中,监听定时器事件

代码实现

  • Hero 中定义 fire 方法
def fire(self):
    print("发射子弹...")
  • plane_main.py 的顶部定义 发射子弹 事件常量
# 英雄发射子弹事件
HERO_FIRE_EVENT = pygame.USEREVENT + 1
  • __init__ 方法末尾中添加 发射子弹 事件
# 每隔 0.5 秒发射一次子弹
pygame.time.set_timer(HERO_FIRE_EVENT, 500)
  • __event_handler 方法中让英雄发射子弹
elif event.type == HERO_FIRE_EVENT:
    self.hero.fire()

4.2 定义子弹类

  • plane_sprites 新建 Bullet 继承自 GameSprite
  • 重写 初始化方法,直接指定 图片名称,并且设置 初始速度
  • 重写 update() 方法,判断子弹 飞出屏幕从精灵组删除
class Bullet(GameSprite):
    """子弹精灵"""
    
    def __init__(self):
        super().__init__("./images/bullet1.png", -2)
 
    def update(self):
        super().update()     
        # 判断是否超出屏幕,如果是,从精灵组删除
        if self.rect.bottom < 0:
            self.kill()

4.3 发射子弹

演练步骤

  1. Hero初始化方法 中创建 子弹精灵组 属性
  2. 修改 plane_main.py__update_sprites 方法,让 子弹精灵组 调用 updatedraw 方法
  3. 实现 fire() 方法
    • 创建子弹精灵
    • 设置初始位置 —— 在 英雄的正上方
    • 子弹 添加到精灵组

代码实现

  • 初始化方法
# 创建子弹的精灵组
self.bullets = pygame.sprite.Group()
  • 修改 fire() 方法
 def fire(self):
        print("发射子弹") 
       # 1.创建子弹精灵
        bullet = Bullet()
        # 2. 设置精灵位置
        bullet.rect.bottom = self.rect.y - 0 * 20
        bullet.rect.centerx = self.rect.centerx
        # 3. 将精灵添加到精灵组
        self.bullets.add(bullet)

你可能感兴趣的:(Python 项目飞机大战- 04 英雄飞机登场)