飞机大战
可以将图片素材绘制到游戏的窗口上,开发游戏之前需要先知道如何建立游戏窗口!
游戏的初始化和退出
- 要使用pygame提供的所有功能之前,需要调用 init 方法
- 在游戏结束前需要调用 quit 方法
方法 | 说明 |
---|---|
pygame.init() | 导入并初始化所有pygame模块,使用其他模块之前,必须先调用init 方法 |
pygame.quit() | 卸载所有pygame模块,在游戏结束之前调用 |
游戏中的坐标系
坐标系
- 原点在左上角(0, 0)
- x轴水平方向向右,逐渐增加
- y轴垂直方向向下,逐渐增加
- 在游戏中,所有可见的元素都是以矩形区域来描述位置的
- 要描述一个矩形区域有四个要素:(x, y)(width, height)
- pygame专门提供了一个类 pygame.Rect 用于描述矩形区域
Rect(x, y, width, height) -> Rect
pygame.Rect是一个比较特殊的类,内部知识封装了一些数字计算,不执行pygame.init()方法同样能够直接使用
创建游戏主窗口
pygame 专门提供了一个模块 pygame.display用于创建、管理游戏窗口
方法 | 说明 |
---|---|
pygame.display.set_modle() | 初始化游戏显示窗口 |
pygame.display.update() | 刷新屏幕内容显示,稍后使用 |
set_mode 方法
set_mode(resolution(0, 0), flags=0,depth=0)->Surface
- 作用–创建游戏显示窗口
- 参数
- resolution指定屏幕的宽和高,默认创建的窗口大小和屏幕大小一致
- flags参数指定屏幕的附加选项,例如是否全屏等等,默认不需要传递
- depth 参数表示颜色的数位,默认自动匹配
- 返回值
- 暂时可以理解为游戏的屏幕,游戏的元素都需要被会知道游戏的屏幕上
- 注意:必须使用变量记录set_mode方法的返回结果!因为:后续的图像都基于这个返回结果
简单的游戏循环
为了做到游戏程序启动后,不会立即退出,通常会在游戏程序中增加一个游戏循环
所谓游戏循环就是一个无限循环
在创建游戏窗口代码下方,增加一个无限循环
- 注意:游戏窗口不需要重复创建
游戏由两个部分组成
游戏初始化:
1,设置游戏窗口。
2,绘制图像初始位置。
3,设置游戏时钟
游戏循环:
1,设置刷新帧率。
2,检测用户交互。
3,更新所有图像位置。
4,更新屏幕显示
理解图像并实现图片绘制
- 在游戏中,能看到的游戏元素大多都是图像
- 图像文件时保存在磁盘上的,如果需要使用,第一步就需要被加载到内存
- 要在屏幕上看到某一图像内容,需要按照三个步骤:
- 使用 pygame.image.load() 加载图像的数据
- 使用游戏屏幕对象,调用 blit(图像,位置) 方法将图像绘制到指定位置
- 调用 pygame.display.update() 方法更新整个屏幕的显示1.
提示:先要在屏幕上看到绘制的结果,就一定要调用 pygame.display.update( ) 方法
理解update() 方法的作用
可以在 screen 对象完成所有 blit 方法治好,统一调用一次 display.update 方法,统一可以在屏幕上看到最终的绘制结果
- 使用display.set_mode()创建的 screen 对象时一个内存中的屏幕数据对象
- 可以理解成是油画中的画布
- screen.blit 方法可以在画布上绘制很多图像
- 这些图像有可能会彼此重叠或者覆盖
- display.update() 会将画布的最终结果绘制在屏幕上,这样可以提高屏幕的绘制效率,增加游戏的流畅度
每一次调用update()方法之前,需要把所有的游戏图像都重新绘制一遍,而且应该最先重新绘制背景图像
游戏时钟
- pygame专门提供了一个类 pygame.time.Clock 可以非常方便的设置屏幕绘制速度——刷新帧率
- 要使用时钟对象需要两步:
- 1,在游戏内初始化创建一个时钟对象
- 2,在游戏循环中让时钟对象调用 tick(帧率) 方法
- tick 方法会根据上次被调用的时间,自动设置游戏循环中的延时
在游戏循环中监听事件
代码实现
- pygame 中通过pygame.event.get() 可以获得用户当前所做动作的事件列表
- 用户可以同一时间做很多事情
- 提示:这段代码非常的固定,几乎所有的pygame游戏都大同小异
1 | while True: |
title: 飞机大战续
date: 2019-08-08 15:34:01
tags:
精灵和精灵组
为了简化开法步骤,pygame提供了两个类
pygame.sprite.Sprite ——存储图像数据image和位置rect的对象
pygame.sprite.Group
精灵(需要派生子类)
1 | image 记录图像数据 |
精灵组
1 | __init__(self, * 精灵): |
游戏
游戏初始化:
- 创建精灵
- 创建精灵组
游戏循环
- 精灵组.update()
- 精灵组.draw(screen)
- pygame.display.update()
派生精灵子类
1,新建 plane_sprites.py 文件
2,定义 GameSpriiite 继承自 pygame.sprite.Sprite
注意
- 如果一个类的父类不是object
- 在重写初始化方法时,一定要先 super() 一下父类的
__init__
方法 - 保证父类中实现的
__init__
代码能够正常执行
1 | GameSprite: |
属性
- image 精灵图像,使用 image_name 加载
- rect 精灵大小,默认使用图像大小
- speed 精灵移动速度,默认为1
方法
- update 每次更新屏幕时在游戏循环内调用
- 让精灵的 self.rect.y += self.speed
提示
- image 的 get_rect() 方法,可以返回 pygame.Rect(0,0,图像宽, 图像高)的对象
使用游戏精灵和精灵组创建敌机
步骤
1,使用 from 导入 plane_sprites模块
- from 导入的模块可以直接使用
- import导入的模块需要通过 模块名. 来使用
2,在游戏初始化创建精灵对象的精灵组对象
3,在游戏循环中,让经理组分别调用 update() 和 draw(screen)方法
职责
- 精灵
- 封装图像 image、位置rect 和速度 speed
- 提供 update() 方法,根据游戏需求,更新位置 rect
- 精灵族
- 包含多个精灵对象
- update方法,让精灵中的所有精灵调用update方法更新位置
- draw(screen) 方法,在 screen 上绘制精灵组中的所有精灵
转载请注明来源,欢迎指出任何有错误或不够清晰的表达。可以邮件至gxnucgb@qq.com
文章标题:飞机大战
文章字数:1.8k
本文作者:陈桂彬
发布时间:2019-08-07, 22:32:56
最后更新:2019-08-08, 16:13:23
原始链接:https://github.com/gxnucgb/gxnucgb.github.io/2019/08/07/飞机大战/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。