pygame--下的飞机大战

1. 使用pygame 创建图像窗口
    1.1 游戏的初始化和退出
        使用pygame 提供的所有功能之前,需要调用init 方法
        在游戏结束前需要调用 quit方法
        方法           说明
        pygame.init()   导入并初始化所有pygame 模块,在使用其他模块之前,必须先调用init方法
        pygame.quit()   卸载所有pygame 模块,在游戏结束之前
    1.2 游戏中的坐标系
        坐标系:
             原点 在 左上角(0,0)
             x轴 水平方向向右,逐渐递增
             y轴 垂直方向向下,逐渐增加
        在游戏中,所有可见的元素 都是以 矩形区域来描述位置的
             要描述一个矩形区域有四个要素 (x,y)(width,height) (矩形左上角的位置)(宽长)
        python 中专门提供了一个类 pygame.Rect 用于描述矩形区域
            pygame.Rect(x,y,width,height)---Rect
            提示:
                pygame.Rect 是一个比较特殊的类,内部只,封装了一些数字计算
                不执行,pygame.init() 方法同样能够直接使用
    1.3 创建游戏主窗口
            pygame 专门提供了一个模块 pygame.display 用于创建,管理 游戏窗口
            方法                       说明
            pygame.display.set_mode()  初始化游戏显示窗口
            pyagme.display.update()    刷新屏幕内容显示,
            set_mode 方法
                set_mode(resolution=(0,0), flags=0,depth=0)  ---->Surface
                作用: 创建游戏显示窗口
                参数: resolution 指定 屏幕的 宽和长 ,默认创建的窗口大小和屏幕大小一样
                       flags      参数指定屏幕的附加选项,如 是否全屏等等,默认不需要传递
                       depth      参数表示颜色的位数,默认自动匹配
                返回值: 暂时可以理解为 游戏的屏幕,游戏的元素都需要被绘制到,游戏的屏幕上
                注意: 必须用变量接受set_mode 的返回值,因为后续所有的图像绘制都基于这个返回值
2. 理解 图片 并实现图像绘制
    在游戏开发中,能够看到的游戏元素 大多数都是 图像
        图像文件 初始是保存在磁盘上的, 如果需要使用,第一步就是要加载到内存
    要在屏幕上看到某一个图像的内容,需要按照三个步骤:
        1. 使用pyagme.image.load(flie_path) 加载图像数据
            bg = pygame.image.load("./images/background.png")
        2. 使用 游戏屏幕 对象,调用 blit(图像对象,绘制到游戏屏幕的位置)方法将图像绘制到指定位置
           screen.blit(bg,(0,0))
        3. 调用pyagme.display.update() 方法更新整个屏幕的显示
           pygame.display.update()
           说明:可以在所有绘制工作完成后,统一调用异常update()方法,更新屏蔽显示

3. 理解 游戏循环 和 游戏时钟
    3.1 游戏中的动画实现原理
         和电影的原理类似,游戏中的动画效果,本质上是 快速 的在屏幕上 绘制图像

         一般在电脑上 每秒绘制60 次,就能够达到非常 连续 高品质的动画效果
             每次绘制的结果被称为 帧,Frame
    3.2 游戏循环
        游戏循环的开始,就意味着 游戏真正的开始
        游戏循环中要做的事情:
            设置刷新帧率
            检测用户交互
            更新所有图像的位置
            更新屏幕显示
        游戏循环的作用:
            1.保证游戏不会直接退出
            2.变化图像位置---动画效果
                 每隔 1/60 秒 移动一下所有图像位置
                 调用 pygame.display.update() 更新屏幕显示
            3.检查用户交互---安检,鼠标等....
    3.3 游戏时钟
        pygame 专门提供了一个类 pygame.time.Clock  可以非常方便的设置屏幕绘制速度--刷新帧率
        要使用 时钟对象 需要两步
            1. 在游戏初始化 时,创建一个时钟对象
            2. 在游戏循环中 让时钟对象调用 tick(帧率) 方法
         tick 方法会根据 上次被调用的时间,自动设置 游戏循环中的延时
    3.4  在游戏循环中 监听事件
         事件 event
             就是游戏启动后,用户针对游戏所做的操作
             例如:点击关闭按钮,点击鼠标,按下键盘....
         监听
             在 游戏循环 中,判断用户 具体的操作
                 只有 捕获 到用户具体的操作,才能有针对性的做出相应
         代码实现:
             python 中通过 pygame.event.get() 可以获得 用户当前所做的动作 的事件列表
                  用户可以同一时间做很多事情
              提示:这段代码非常固定,几乎所有的python 游戏都 大同小异
4. 理解精灵和精灵组
    4.1 精灵和精灵组
        图像的加载,位置编号,图像绘制,都需要程序员自己编写代码分别处理
        为了简化开发步骤,pygame提供了两个类
            pygame.sprite.Sprite  ---存储 图像数据和位置 的对象
            精灵(需要派生子类,每个精灵的移动方式不同):
                image  记录图像数据
                rect   记录在屏幕上的位置(位置+图片的长高)
                update(*args):更新位置
                kill():     从所有组件中删除,该精灵
            pygame.sprite.Group
            精灵组
                __init(self,*精灵):
                add(* sprites): 向组内增加精灵
                sprites():返回所有精灵列表
                update(*args):让组中所有精灵调用自己的update() 方法
                draw(Surface): 将组中所有的 image ,绘制到 Surface(屏幕)的 rect 位置
    4.2 派生精灵 子类
        1. 新建 plane_sprites.py 文件
        2. 定义 GameSprite 继承自 pygame.sprite.Sprite 类
        注意:
            如果一个类的 父类 不是object,在重写 初始化方法时,
            一定要先 super() 一下父类的 __init__()方法
            保证父类 中实现的__init__代码能够正常执行
    4.3 使用 游戏精灵 和精灵组 创建敌机
        1. 在游戏初始化时,创建精灵对象 和精灵组对象
        2. 在游戏循环中 让精灵组对象 分别调用 update() 和 draw(screen) 方法

1. 游戏背景
    1.0 背景交替滚动的思路
        游戏启动后,背景图像 会连续不断地 向下方 移动
        在 视觉 上 产生英雄的飞机 不断向上飞行的 错觉---很多跑酷类游戏中常用的方法
             游戏背景 不断变化
             游戏的主角 位置保持不变
    1.1 实现思路的分析
        1.创建两张背景图片精灵
            第一张 完全和屏幕重合
            第二张 在屏幕的正上方
        2. 两张图片一起向下方运动
           self.rect.y += self.sneed
        3. 当任意背景精灵的 rect.y >= 屏幕的高度,说明已经移动到屏幕下方
        4. 将 移动到屏幕下方的这张图片,重新设置到屏幕的正上方
            rect.y = - rect.height
    1.2 设计背景类
        让背景类基础于GameSprite 因为update 方法不同,要实现滚动
        初始化方法:
            直接指定 背景图片
            is_alt 判断是否为另外一张图片
                 False 表示第一张图片,需要与屏幕重合
                 True  表示另外一张图片,需要在屏幕的正上方
        update() 方法
            判断 是否移动出屏幕,如果是,将图像设置到 屏幕的正上方,从而实现屏幕的滚动
2.敌机出场
    2.0 使用定时器添加敌机
         1. 游戏启动后,每隔1秒会出现一架敌机
         2. 每架敌机 向屏幕下方飞行,飞行速度各不相同
         3. 每架敌机出现的水平位置 也不尽相同
         4. 当敌机 从屏幕下方飞出去,不在回到屏幕中
    2.1 定时器
        在pygame 中可以使用 pygame.time.set_timer() 来添加定时器
        所谓定时器,就是 每隔一段时间,去执行一些动作
            set_timer(eventid,milliseconds)  --> None
            set_timer 可以创建一个事件
            可以 在游戏循环 的事件监听 方法
            第1 个参数 事件代号,需要基于常量 pygame.USEREVENT 来指定
                USEREVENT 是一个整数,再增加的事件可以使用 USEREVENT +1 来指定,一次类推...
            第二个参数 是事件触发 间隔 毫秒(每隔多长时间触发一下事件)
        定时器事件的监听
            通过 pygame.event.get() 可以获取当前时刻所有的 事件列表
            遍历列表 并判断 event.type  是否等于 eventid 如果相等,表示 定时器事件 发生
    2.2 定义并监听创建敌机的定时器事件
        pygame 的定时器 使用非常固定
            1. 定义 定时器事件常量 ---eventid
            2. 在初始化方法中,调用 set_timer() 方法 设置定时器事件
            3. 在游戏循环中,监听定时器事件
3. 英雄飞机
    3.0 英雄飞机需求
         1.游戏启动后 ,英雄出现在屏幕的水平中间位置,距离 屏幕底部 120 像素
         2.英雄 每隔0.5秒 发射子弹,每次连发3 枚子弹
         3. 英雄飞机默认不会移动,需要通过左/右 方向键,控制 飞机在水平方向移动
    3.1 移动英雄位置
        在 pygame 中 针对键盘按键的捕获,有两种方式:
        第一种方式:遍历事件列表,判断 event.type 事件类型是否 == pygame.KEYDOWN,
                     如果事件成立,表示用户安下了键,再判断安下的键的类型
             elif event.type == pygame.KEYDOWN  and event.key == pygame.K_RIGHT:
                 print("向右移动")
             注意:这种方式不能捕获连续的按键,只能捕获按一下,再按一下 ....
        第二种方式:1.首先使用 pygame.key.get_pressed()返回所有按键元组
                    2. 通过 键盘常量,判断元组中 某一个键是否被按下---如果被按下,对应的数值为1
             keys_pressed = pygame.key.get_pressed()
             if keys_pressed[pygame.KRIGHT]:
                 print("向右移动")
4. 碰撞检测
    4.0 了解碰撞检测方法
        pygame 提供了 两个非常方便 的方法可以 实现碰撞检测

        pygame.sprite.groupcollide()
            两个精灵组 中 所有的精灵 的碰撞检测
            groupcollide(group1,group2,dokill1,dokill2,collided = None)---》Sprite_dict
                如果将 dokill 设置为True,则 发生碰撞的精灵将被自动移除
                collided 参数是用于 计算碰撞的回调函数
                     如果没有指定,则每个精灵必须有一个 rect 属性
        pygame.sprite.spritecollide()
            判断某个精灵 和指定的精灵组 中的精灵的碰撞
            spritecollide(sprite,group,dokill,collided = None) --->Sprite_list
                如果  dokill 设置为True,则指定精灵组中 发生碰撞的精灵将被自动移除
                collided 参数是用于 计算碰撞的回调函数
                     如果没有指定,则每个精灵必须有一个 rect 属性
                 返回 精灵组 中 跟精灵 发生 碰撞的精灵列表
源代码下载路径: https://download.csdn.net/download/b903299114/10496259



猜你喜欢

转载自blog.csdn.net/B903299114/article/details/80791713