054_wz_hm_项目实战——飞机大战之英雄
2020-09-05 本文已影响0人
王泽0106
设计英雄和子弹类
英雄需求:
- 游戏启动后,英雄出现再屏幕的水平中间位置,距离屏幕底部120像素
- 英雄每隔0.5秒发射一次子弹,每次连发三枚子弹
- 英雄默认不会移动,需要通过左/右方向键控制英雄在水平方向的移动
子弹需求
- 子弹从英雄的正上方沿直线向上方飞行
- 飞出屏幕后,需要从精灵组中删除
Hero——英雄
1. 初始化方法
- 指定英雄图片
- 初始速度 = 0——英雄默认静止不动
- 定义
bullets
子弹精灵组保存子弹精灵
2. 重写update方法 - 英雄需要水平移动
- 并且保证不能移出屏幕
3. 增加bullets
属性,记录所有子弹精灵
4. 增加fire
方法,用于发射子弹
创建英雄
准备英雄类
- 在
plane_sprites
中新建Hero
类 - 重写初始化方法,直接指定图片路径,并且将初始速度设置为0
- 设置英雄的初始位置
英雄飞机位置
代码实现:
绘制英雄
- 在
__create_sprites
,添加英雄精灵和英雄精灵组
- 后续要针对英雄做碰撞检测以及发射子弹
- 所以英雄需要单独定义成属性
- 在
__update_sprites
,让英雄精灵组调用update
和draw
方法
英雄更新绘制
移动英雄位置
在python中针对键盘按键的捕获,有两种方式:
- 判断
event.type == pygame.KEYDOWN
- 1) 首先使用
pygame.key.get.pressed()
返回所有按键元素
2) 通过键盘常量,判断元组中某一个键是否被按下——如果被按下对应数值为1
两种方式
提问:这两种方式有什么区别呢?
答:第一种方式用户必须要抬起按键才算一次按键事件,操作灵活性大打折扣;第二种方式用户可以按住方向键不放,就能够实现持续向某一个方向移动,灵活性更好
移动实现
- 在
Hero
类中重写update
方法
- 用速度
speed
和英雄rect.x
进行叠加 - 不需要调用父类方法——因为父类方法只是单纯的实现了垂直运动
- 在
__event_handler
方法中根据左右方向键设置英雄的速度
- 向右——
speed = 2
- 向左——
speed = -2
‘ - 其他——
speed = 0
控制英雄的运动边界
在Hero
类的update()
方法判断英雄是否超出屏幕边界
right = x + width
利用right
属性可以非常容易的针对右侧设置精灵位置
设置精灵位置
发射子弹
添加发射子弹事件
pygame的定时器使用套路非常固定:
- 定义定时器常量——
eventid
- 在初始化方法中,调用
set_timer
方法设置定时器事件
- 在游戏循环中,监听定时器事件
定义子弹类
Bullet——子弹
- 初始化方法
- 指定子弹图片
- 初始速度 = -2——子弹需要向上方飞行
- 重写
update()
方法
- 判断是否飞出屏幕,如果是,从精灵组中删除
发射子弹
- 在
Hero
的初始化方法中创建子弹精灵组属性
- 修改
plane_main.py
的__update_sprites
方法,让子弹精灵组调用update
和draw
方法
- 实现
fire()
方法
- 创建子弹精灵
- 设置初始位置——在英雄的正上方
- 将子弹添加到精灵组
一次发射三枚子弹
三枚子弹位置修改
fire()
方法
fire方法
2020.9.4