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
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