当前位置:网站首页>飞机大战敌机出场
飞机大战敌机出场
2022-07-27 16:17:00 【道而起】
敌机出场
文章目录
一.目标
- 使用 定时器 添加敌机
- 设计 Enemy 类
01. 使用定时器添加敌机
- 游戏启动后,每隔 1 秒 会 出现一架敌机
- 每架敌机 向屏幕下方飞行,飞行 速度各不相同
- 每架敌机出现的 水平位置 也不尽相同
- 当敌机 从屏幕下方飞出,不会再飞回到屏幕中
02 定时器
- 在 pygame 中可以使用 pygame.time.set_timer() 来添加 定时器
- 所谓 定时器,就是 每隔一段时间,去 执行一些动作
set_timer(eventid, milliseconds) -> None
- set_timer 可以创建一个 事件
- 可以在 游戏循环 的 事件监听 方法中捕获到该事件
- 第 1 个参数 事件代号 需要基于常量 pygame.USEREVENT 来指定
- USEREVENT 是一个整数,再增加的事件可以使用 USEREVENT + 1 指定,依次类推…
- 第 2 个参数是 事件触发 间隔的 毫秒值
03定时器事件的监听
- 通过 pygame.event.get() 可以获取当前时刻所有的 事件列表
- 遍历列表 并且判断 event.type 是否等于 eventid,如果相等,表示 定时器事件 发生
二.定义并监听创建敌机的定时器事件
pygame 的 定时器 使用套路非常固定:
- 定义 定时器常量 —— eventid
- 在 初始化方法 中,调用 set_timer 方法 设置定时器事件
- 在 游戏循环 中,监听定时器事件
01 .定义事件
- 在 plane_sprites.py 的顶部定义 事件常量
# 敌机的定时器事件常量
CREATE_ENEMY_EVENT = pygame.USEREVENT
- 在 PlaneGame 的 初始化方法 中 创建用户事件
# 设置定时器事件 - 每秒创建一架敌机
pygame.time.set_timer(CREATE_ENEMY_EVENT, 1000)
02. 监听定时器事件
- 在 __event_handler 方法中增加以下代码:
def __event_handler(self):
for event in pygame.event.get():
# 判断是否退出游戏
if event.type == pygame.QUIT:
PlaneGame.__game_over()
elif event.type == CREATE_ENEMY_EVENT:
print("敌机出场...")
三.设计 Enemy 类
- 游戏启动后,每隔 1 秒 会 出现一架敌机
- 每架敌机 向屏幕下方飞行,飞行 速度各不相同
- 每架敌机出现的 水平位置 也不尽相同
- 当敌机 从屏幕下方飞出,不会再飞回到屏幕中
01.初始化方法
- 指定 敌机图片
- 随机 敌机的 初始位置 和 初始速度
- 重写 update() 方法
- 判断 是否飞出屏幕,如果是,从 精灵组 删除
02. 敌机类的准备
- 在 plane_sprites 新建 Enemy 继承自 GameSprite
- 重写 初始化方法,直接指定 图片名称
- 暂时 不实现 随机速度 和 随机位置 的指定
- 重写 update 方法,判断是否飞出屏幕
class Enemy(GameSprite):
"""敌机精灵"""
def __init__(self):
# 1. 调用父类方法,创建敌机精灵,并且指定敌机的图像
super().__init__("./images/enemy1.png")
# 2. 设置敌机的随机初始速度
# 3. 设置敌机的随机初始位置
def update(self):
# 1. 调用父类方法,让敌机在垂直方向运动
super().update()
# 2. 判断是否飞出屏幕,如果是,需要将敌机从精灵组删除
if self.rect.y >= SCREEN_RECT.height:
print("敌机飞出屏幕...")
03.创建敌机
演练步骤
- 在 __create_sprites,添加 敌机精灵组
- 敌机是 定时被创建的,因此在初始化方法中,不需要创建敌机
- 在 __event_handler,创建敌机,并且 添加到精灵组
- 调用 精灵组 的 add 方法可以 向精灵组添加精灵
- 在 __update_sprites,让 敌机精灵组 调用 update 和 draw 方法
演练代码
- 修改 plane_main 的 __create_sprites 方法
# 敌机组
self.enemy_group = pygame.sprite.Group()
修改 plane_main 的 __update_sprites 方法
self.enemy_group.update()
self.enemy_group.draw(self.screen)
定时出现敌机
elif event.type == CREATE_ENEMY_EVENT:
self.enemy_group.add(Enemy())
四.随机敌机位置和速度
01. 导入模块
- 在导入模块时,建议 按照以下顺序导入
- 官方标准模块导入
- 第三方模块导入
- 应用程序模块导入
修改 plane_sprites.py 增加 random 的导入
import random
02.随机位置
使用 pygame.Rect 提供的 bottom 属性,在指定敌机初始位置时,会比较方便
bottom = y + height
y = bottom - height
03.代码实现
- 修改 初始化方法,随机敌机出现 速度 和 位置
def __init__(self):
# 1. 调用父类方法,创建敌机精灵,并且指定敌机的图像
super().__init__("./images/enemy1.png")
# 2. 设置敌机的随机初始速度 1 ~ 3
self.speed = random.randint(1, 3)
# 3. 设置敌机的随机初始位置
self.rect.bottom = 0
max_x = SCREEN_RECT.width - self.rect.width
self.rect.x = random.randint(0, max_x)
移出屏幕销毁敌机
def __del__(self):
print("敌机挂了 %s" % self.rect)
代码实现
def update(self):
super().update()
# 判断敌机是否移出屏幕
if self.rect.y >= SCREEN_RECT.height:
# 将精灵从所有组中删除
self.kill()
五.小结
本章概述了飞机大战中敌方飞机的实现,实现方式不固定,各位按照自己的理解做就好,也可以修改一些参数,看一下变化,了解其控制什么.
有哪里不足或者有更好的建议,欢迎留言吐槽,有哪里不懂的小伙伴,可以私信我,我会一一答复,感谢认可,感谢支持!
边栏推荐
- 多功能无线遥控艾灸仪芯片-DLTAP703SD
- Hbuilder submission code
- Class not found: "the com.parkmanagement.dao.daotest test cannot find the test class
- 2021.7.28 notes
- 20000 words + 30 pictures | what's the use of chatting about MySQL undo log, redo log and binlog?
- JS to achieve smooth scrolling of pages or DOM elements
- Wechat applet wxacode.getunlimited generates applet code
- 2021.7.22笔记 约束
- org.gradle.api. UncheckedIOException: Could not load properties for module ‘gradle-kotlin-dsl‘ from C
- Login page tablelayout
猜你喜欢

Run the uniapp to the mobile phone (real machine debugging)

2 万字 + 30 张图 | 细聊 MySQL undo log、redo log、binlog 有什么用?

阿里架构师耗时280个小时整理的1015页分布式全栈小册,轻松入手分布式系统

电动加热护颈枕芯片-DLTAP703SC

2021.7.13 note sub query

2021.7.22 note constraints

Uni app for wechat login (to be finished)

阿里p8总结的10条 SQL 优化方案(非常实用)

2021.7.17 notes MySQL other commands

Why don't you like it? It's easy to send mail in ci/cd
随机推荐
机器学习——SVM训练集只有一类标签数据而引发的错误
2021.7.19 notes DML
uniapp运行到手机(真机调试)
2021.7.17笔记 mysql其他命令
机器学习分类任务效果评估指标大全(包含ROC和AUC)
Let's move forward together, the 10th anniversary of Google play!
RuntimeError: output with shape [1, 256, 256] doesn‘t match the broadcast shape [3, 256, 256]【报错】
2021.7.28 notes
Uni app label jump
Uni app traversal array rendering data vertical rendering
MySQL 主从复制数据不一致,怎么办?
[mit 6.s081] LEC 4: page tables notes
Run the uniapp to the mobile phone (real machine debugging)
迷你洗衣机触摸芯片-DLT8MA12TS-杰力科创
INSUFFICIENT_ ACCESS_ ON_ CROSS_ REFERENCE_ ENTITY APEX / SALESFORCE
Commonly used built-in methods of mybtis plus
2021.7.22笔记 约束
浴室带除雾化妆镜触摸芯片-DLT8T10S
Part of speech list of common words
阿里p8总结的10条 SQL 优化方案(非常实用)