• 欢迎光临~

8.pygame-敌方角色

开发技术 开发技术 2022-05-22 次浏览
使用定时器添加敌机
游戏启动后,每隔一秒出现一架敌方飞机
每架飞机向屏幕下方飞行,速度各不相同
没加敌机出现的水平位置也不进相同
当敌机从屏幕下方飞出,不会再飞回到屏幕中
 
定时器
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()
    
 

程序员灯塔
转载请注明原文链接:8.pygame-敌方角色
喜欢 (0)