zoukankan      html  css  js  c++  java
  • 26飞机大战_敌机

     

    1.  使用定时器添加敌机


    运行 备课代码,  观察 敌机的 出现规律:

    1. 游戏启动后,  每隔 1 秒 会出现 一架敌机
    2. 每架敌机,  向屏幕下方飞行,  分行  速度各不相同
    3. 每架敌机出现的 水平位置 也不尽相同
    4. 当敌机 从屏幕下方飞出,  不会再飞回到屏幕中

    1.1  定时器

    • 在 pygame 中可以使用 pygame.time.set_timer() 来添加 定时器
    • 所谓 定时器,  就是 每隔一段时间,  去 执行一些动作
    set_timer(eventid, milliseconds) 
    • set_timer 可以创建一个 事件
    • 可以在 游戏循环 的 事件监听 方法中捕获到该事件
    • 第 1 个参数 事件代号 需要基于常量 pygame.USEREVENT 来指定USEREVENT  是一个整数,  再增加的事件可以使用 USEREVENT + 1 指定
    • 第 2 个参数是 事件触发 间隔的 毫秒值

    定时器时间的监听

    • 通过 pygame.event.get() 可以获取当前时刻所有的时间列表
    • 遍历列表 并且判断 event.type 是否等于 eventid , 如果相等, 表示 定时器时间 发生

    1.2  定义并监听创建敌机的定时器事件

    pygame 的 定时器 使用套路非常固定:

    1. 定义 定时器常量 ---- eventid
    2. 在 初始化方法 中,  调用 set_timer 方法 设置定时器事件
    3. 在 游戏循环 中,  监听定时器事件

    1) 定义事件

    • 在 plane_sprites.py 的顶部定义 事件常量
    # 创建敌机的定时器常量
    CREATE_ENEMY_EVENT = pygame.USEREVENT

    2) 设置定时事件

    • 在 plane_main.py 初始化
    # 4. 设置定时器事件 - 创建敌机 1s
    pygame.time.set_timer(CREATE_ENEMY_EVENT, 1000)

    3) 监听定时器事件

    • 在 __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("敌机出场...")

    2.  设计 Enemy 类


    1. 游戏启动后, 每隔 1 秒 会 出现一架敌机
    2. 每架敌机 向下屏幕下方飞行,  飞行 速度各不相同
    3. 每架敌机出现的 水平位置 也不尽相同
    4. 当敌机 从屏幕下方飞出,  不会飞回到屏幕中

    • 初始化方法

      指定 敌机图片

      随机 敌机的  初始位置 和 初始速度 
    • 重新 update() 方法

      判断 是否飞出屏幕,  如果是,  从 精灵组 删除

    2.1  敌机类的准备

    class Enemy(GameSprite):
        """敌机精灵"""
     
        def __init__(self):
     
            # 1. 调用父类方法, 创建敌机精灵, 同时制定敌机图片
            super().__init__("./image/enemy1.png")
            # 2. 制定敌机的初始随机速度
     
            # 3. 制定敌机的初始随机位置
     
            pass
     
        def update(self):
     
            # 1. 调用父类方法, 保持垂直方向的飞行
            super().update()
            # 2. 判断是否飞出屏幕. 如果是, 需要从精灵组删除敌机
            if self.rect.y >= SCREEN_RECT.height:
                print("飞出屏幕,需要从精灵组删除...")

    2.2 创建敌机

    1. 在 __create_sprites,  添加 敌机精灵组

    • 敌机是 定时被创建的,  因此在初始化方法中,  不需要创建敌机

    2.  在 __event_handler,  创建敌机,  并且 添加到精灵组

    • 调用 精灵组 的 add 方法可以 向精灵组添加精灵

    3.  在 __update_sprites , 让 敌机精灵组 调用 update 和 draw 方法

    • 创建敌机精灵组
    # 创建敌机的精灵组
            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:
                    print("敌机出场...")
                    # 1. 创建敌机精灵
                    enemy = Enemy()
                    # 2. 将敌机精灵添加到精灵组
                    self.enemy_group.add(enemy)

    2.3  随机敌机位置和速度

    1)  导入模块

    • 在导入模块时, 建议 安装以下顺序导入
    1. 官方标准模块导入
    2. 第三方模块导入
    3. 应用程序模块导入
    • 修改 plane_sprites.py 增加 random 的导入

    import random

    2)  随机模块 

    使用 pygame.Rect 提供的 bottom 属性,  在指定敌机初始位置时,  会比较方便

    • bottom = y + height
    • y = bottom - height 

    3)  代码实现 

    • 修改 初始化方法,  随机敌机出现 速度 和 位置
        def __init__(self):
     
            # 1. 调用父类方法, 创建敌机精灵, 同时制定敌机图片
            super().__init__("./images/enemy1.png")
            # 2. 制定敌机的初始随机速度
            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)

    2.4  移出屏幕销毁敌机

    • 敌机移出屏幕之后,  如果 没有撞到英雄,  敌机的历史使命已经终结
    • 需要从 敌机组 删除,  否则会造成 内存浪费

    检测敌机被销毁

    • __del__ 内置方法会在对象被销毁前调用,  在开发中,  可以用于 判断对象是否被销毁
    def __del__(self):
        print("敌机挂了 %s" % self.rect)
    • 判断敌机是否飞出屏幕,  如果是, 调用 kill() 方法从所有组中删除
        def update(self):
     
            # 1. 调用父类方法, 保持垂直方向的飞行
            super().update()
            # 2. 判断是否飞出屏幕. 如果是, 需要从精灵组删除敌机
            if self.rect.y >= SCREEN_RECT.height:
                print("飞出屏幕,需要从精灵组删除...")
                # kill 方法可以将精灵从所有精灵组中移除, 精灵就会被自动销毁
                self.kill()
  • 相关阅读:
    PHP保留小数的相关方法
    ASP.NET Core MVC 之过滤器(Filter)
    ASP.NET Core MVC 之控制器(Controller)
    ASP.NET Core MVC 之视图组件(View Component)
    ASP.NET Core MVC 之局部视图(Partial Views)
    标签助手(TagHelper)
    ASP.NET Core MVC 之布局(Layout)
    ASP.NET Core MVC 之视图(Views)
    ASP.NET Core MVC 之模型(Model)
    九卷读书:淘宝从小到大的发展 -重读《淘宝技术这十年》
  • 原文地址:https://www.cnblogs.com/xinmomoyan/p/10354538.html
Copyright © 2011-2022 走看看