英雄需求
Bullet —— 子弹
2.1 准备英雄类
class Hero(GameSprite):
"""英雄精灵"""
def __init__(self):
super().__init__("./images/me1.png", 0)
# 设置初始位置
self.rect.centerx = SCREEN_RECT.centerx
self.rect.bottom = SCREEN_RECT.bottom - 120
2.2 绘制英雄
代码实现
# 英雄组
self.hero = Hero()
self.hero_group = pygame.sprite.Group(self.hero)
修改 __update_sprites 方法如下:
self.hero_group.update()
self.hero_group.draw(self.screen)
在 pygame 中针对 键盘按键的捕获,有 两种 方式
提问 这两种方式之间有什么区别呢?
elif event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT:
print("向右移动...")
第二种方式
# 返回所有按键的元组,如果某个键被按下,对应的值会是1
keys_pressed = pygame.key.get_pressed()
# 判断是否按下了方向键
if keys_pressed[pygame.K_RIGHT]:
print("向右移动...")
结论
3.1 移动英雄位置
演练步骤
代码演练
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
在 Hero 类的 update() 方法判断 英雄 是否超出 屏幕边界
right = x + width 利用 right 属性可以非常容易的针对右侧设置精灵位置
def update(self):
# 飞机水平移动
self.rect.x += self.speed
# 判断屏幕边界
if self.rect.left < 0:
self.rect.left = 0
if self.rect.right > SCREEN_RECT.right:
self.rect.right = SCREEN_RECT.right
需求回顾 —— 英雄需求
4.1 添加发射子弹事件
pygame 的 定时器 使用套路非常固定:
代码实现
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 定义子弹类
需求回顾 —— 子弹需求
Bullet —— 子弹