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()
  • 相关阅读:
    转:使用vs2013打开VS2015的工程文件的解决方案(适用于大多数vs低版本打开高版本)
    linq 动态组合条件
    转:Web应用程序项目XX已配置为使用IIS
    转:centos彻底删除文件夹、文件命令
    转:WebClient类(温习一下)
    解决 ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
    转:装完Centos7提示Initial setup of CentOS Linux 7 (core)
    PL/SQL Developer 登录 Oracle 12c和Win10下安装Oracle 11g
    centos7-linux安装docker(离线方式)
    windows7安装gitblit
  • 原文地址:https://www.cnblogs.com/xinmomoyan/p/10354538.html
Copyright © 2011-2022 走看看