目标
使用 定时器 添加敌机
设计 Enemy 类
1、使用定时器添加敌机
运行 备课代码,观察 敌机的 出现规律:
1)、游戏启动后,每隔 1 秒 会 出现一架敌机;
2)、每架敌机 向屏幕下方飞行,飞行 速度不相同;
3)、每架敌机出现的 水平位置 也不尽相同;
4)、当敌机 从屏幕下方飞出,不会再飞回到屏幕中;
1.1 定时器
在 pygame 中可以使用 pygame.time.set_timer() 来添加 定时器;
所谓 定时器,就是 每隔一段时间,去 执行一些动作;
set_timer(eventid,milliseconds) -> None
set_timer 可以创建一个 事件;
可以在 游戏循环 的 事件监听 方法中不会到该事件;
第1个参数 事件代码 需要基于常量 pygame.USEREVENT 来指定;
USEREVENT 是一个整数,再增加的事件可以使用 USEREVENT+ 1 指定,依次类推…
通过 pygame.event.get() 可以获取当前时刻所有的 事件列表;
遍历列表 并且判断 event.type 是否等于 eventid,如果相等,表示 定时器事件 发生。
1.2 定义并监听创建敌机事件
pygame 的 定时器 使用套路非常固定:
1)、定义 定时器常量 — eventid;
2)、在 初始化方法 中,调用 set_timer 方法 设置定时器事件;
3)、在 游戏循环 中,监听定时器事件;
1)、定义事件
在 plane_sprites.py 的顶部定义 事件常量
# 敌机出现事件
CREATE_EVENT = pygame.USEREVENT
2、设计Enemy 类
1、游戏启动后,每隔 1 秒 会出现一架敌机;
2、每架敌机 向屏幕下方飞行,飞行 速度各部相同;
3、每架敌机出现的 水平位置 也不尽相同;
4、当敌机 从屏幕下方飞出,不会再飞回到屏幕中;
初始化方法:
指定 敌机图片;
随机 敌机的 初始位置 和 初始速度;
重写 update() 方法
判断 是否飞出屏幕,如果是,从 精灵组 删除;
2.1、 敌机类的准备
演练步骤
1、在 _create_sprites,添加 敌机精灵组;
敌机是 定时被创建的,因此在初始化方法中,不需要创建敌机;
2、在 _event_handler,创建敌机,并且 添加到精灵组;
调用 精灵组 的 add 方法可以 向精灵组添加精灵;
3、在 _update_sprites, 让 敌机精灵组 调用 update 和 draw 方法;
2.3 随机敌机位置和速度
1)、导入模块
在导入模块时,建议 按照以下顺序导入
1、官方标准模块导入
2、第三方模块导入
3、应用程序模块导入
修改 plane_sprites.py 增加 random 的导入
import random
2)、随机位置
使用 pygame.Rect 提供的 bottom 属性,在指定敌机初始化位置时,会比较方便。
bottom = y + height
y = bottom - height
2.4 移除屏幕销毁敌机
敌机移出屏幕之后,如果 没有撞到英雄,敌机的历史使命已经终结。
需要从 敌机组 删除,否则会造成 内存浪费。
检查敌机被销毁
del 内置方法会在对象被销毁前调用,在开发中,可以用于 判断对象是否被销毁。
def __del__(self):
print("敌机挂了 %s" % self.rect)
代码实现
判断敌机是否飞出屏幕,如果是,调用 kill() 方法从所有组中删除。
def update(self):
super().update(args)
# 判断敌机是否移出屏幕
if self.rect.y >= SCREEN_RECT.height:
# 将精灵从所有组中删除
self.kill()