8.pygame-定时器
阅读原文时间:2023年07月08日阅读:3

使用定时器添加敌机

游戏启动后,每隔一秒出现一架敌方飞机

每架飞机向屏幕下方飞行,速度各不相同

没加敌机出现的水平位置也不进相同

当敌机从屏幕下方飞出,不会再飞回到屏幕中

定时器

pygame中使用pygame.time.set_timer()来添加定时器

所谓定时器,就是每隔一段时间,去执行一些动作

set_timer(eventid,milliseconds) -> None
"""
set_timer可以创建一个事件
可以在游戏循环的事件监听方法中捕获到时间
eventid:事件id,基于pygame.USEREVENT指定
milliseconds:事件触发间隔的毫秒值
通过pygame.event.get获取所有事件列表
遍历判断event.type ==eventid,如果相等,表示定时器事件发生
"""

定义监听创建敌机事件

# 创建敌机定时器事件常量
CREATE_ENEMY_EVENT = pygame.USEREVENT

# 主程序初始化方法中设置定时器事件 - 创建敌机 1000毫秒
pygame.time.set_timer(CREATE_ENEMY_EVENT,1000)

"""敌机精灵"""
class Enemy(GameSprite):
    def __init__(self):
        # 调用父类方法 创建敌机精灵,指定图片
        super().__init__('./images/enemy1.png', 1)

        # 指定敌机初始随机速度 1~3
        self.speed = random.randint(1,3)
        # 指定敌机初始随机位置
        # bottom:矩形对象的下边缘,即左下顶点对应的y坐标(左上顶点的纵坐标+矩形对象的高)
        self.rect.bottom = 0
        max_x = SCREEN_RECT.width - self.rect.width
        self.rect.x = random.randint(0,max_x)

    def update(self):
        # 调用父类方法保持垂直方向的飞行
        super().update()
        # 判断是否飞出屏幕。如果是,从精灵组删除
        if self.rect.y >= SCREEN_RECT.height:
            self.kill() # 调用kill方法,将精灵从所有精灵组删除

"""飞机大战主程序"""
class PlaneGame(object):

    # 完成游戏的初始化动作
    def __init__(self):
        print('--游戏初始化--')
        # 创建游戏窗口 SCREEN_RECT是plane_sprites定义的常量,设定了窗口的大小,通过size获取窗口大小
        self.screen = pygame.display.set_mode(SCREEN_RECT.size)
        # 创建游戏时钟
        self.clock = pygame.time.Clock()
        # 调用私有方法 创建精灵和精灵组
        self.__create_sprites()

        # 设置定时器事件 - 创建敌机 1000毫秒
        pygame.time.set_timer(CREATE_ENEMY_EVENT,1000)

    # 私有方法-创建精灵、精灵组
    def __create_sprites(self):
        # 创建两个背景精灵加入精灵组,实现循环滚动
        background_1 = Background()
        background_2 = Background(True) # 设置True表示交替背景,设置位置
        self.back_group = pygame.sprite.Group(background_1,background_2)

        # 创建敌机精灵组
        self.enemy_group = pygame.sprite.Group()

    # 私有方法-更新精灵组
    def __update_sprites(self):
        self.back_group.update()  # 更新背景精灵组所有精灵
        self.back_group.draw(self.screen)  # 绘制精灵组图像
        self.enemy_group.update() # 更新敌机精灵组精灵
        self.enemy_group.draw(self.screen)

    # 私有方法-事件监听
    def __event_handler(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:  # 判断是否退出游戏
                self.__game_over()
            elif event.type == CREATE_ENEMY_EVENT: # 判断敌机事件
                print('--敌机出场--')
                # 创建敌机精灵
                enemy = Enemy()
                # 通过精灵组.add方法,将敌机精灵添加到精灵组
                self.enemy_group.add(enemy)

    # 私有方法-碰撞监测
    def __check_collide(self):
        pass

    @staticmethod  # 私有方法-结束游戏
    def __game_over():
        print('--游戏结束--')
        pygame.quit()
        exit()

    # 游戏循环
    def start_game(self):
        print('--游戏开始--')
        while True:
            # 设置刷新帧率
            self.clock.tick(FRAME_PER_SEC)
            # 事件监听
            self.__event_handler()
            # 碰撞监测
            self.__check_collide()
            # 更新、绘制精灵组
            self.__update_sprites()
            # 更新显示
            pygame.display.update()

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器