美文网首页python入门
054_wz_hm_项目实战——飞机大战之英雄

054_wz_hm_项目实战——飞机大战之英雄

作者: 王泽0106 | 来源:发表于2020-09-05 20:23 被阅读0次

设计英雄和子弹类

英雄需求:

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

子弹需求

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

Hero——英雄

1. 初始化方法

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

创建英雄

准备英雄类

  • plane_sprites中新建Hero
  • 重写初始化方法,直接指定图片路径,并且将初始速度设置为0
  • 设置英雄的初始位置
Rect类提供的属性
英雄飞机位置

代码实现:

英雄类

绘制英雄

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

移动英雄位置

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

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

提问:这两种方式有什么区别呢?
答:第一种方式用户必须要抬起按键才算一次按键事件,操作灵活性大打折扣;第二种方式用户可以按住方向键不放,就能够实现持续向某一个方向移动,灵活性更好

移动实现

  1. Hero类中重写update方法
  • 用速度speed和英雄rect.x进行叠加
  • 不需要调用父类方法——因为父类方法只是单纯的实现了垂直运动
update
  1. __event_handler方法中根据左右方向键设置英雄的速度
  • 向右——speed = 2
  • 向左——speed = -2
  • 其他——speed = 0
__event_handler

控制英雄的运动边界

Hero类的update()方法判断英雄是否超出屏幕边界

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

发射子弹

添加发射子弹事件

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

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

定义子弹类

Bullet——子弹

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

发射子弹

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

一次发射三枚子弹

三枚子弹位置
修改fire()方法 fire方法

2020.9.4

相关文章

网友评论

    本文标题:054_wz_hm_项目实战——飞机大战之英雄

    本文链接:https://www.haomeiwen.com/subject/bnxysktx.html