# Header
封存, 未来并不打算继续深入
鉴定为可靠性为5%的11km重坦 –2023.5-6
# 显示
# Surface
元素组件的载体
# 新建图层对象
Surface=pygame.Surface(size=(width,height),flags,depth)
- size:表示 Surface 对象的矩形区域大小;如果不设置尺寸,Surface 默认创建一个和主游戏屏幕同样大小的区域。
- flags:功能标志位,有两个可选参数值 HWSURFACE 和 SPCALPHA,前者代表将创建的 Surface 对象存放于显存中,后者表示让图像的每一个像素都包含一个 alpha 通道
- depth:指定像素的颜色深度,默认为自适应模式,由 Pygame 自动调节。
方法 | 说明 |
---|---|
pygame.Surface.blit() | 将一个图像(Surface 对象)绘制到另一个图像上 |
pygame.Surface.convert() | 修改图像(Surface 对象)的像素格式 |
pygame.Surface.fill() | 使用纯色填充 Surface 对象 |
pygame.Surface.scroll() | 复制并移动 Surface 对象 |
pygame.Surface.set_alpha() | 设置整个图像的透明度 |
pygame.Surface.get_at() | 获取一个像素的颜色值 |
pygame.Surface.set_at() | 设置一个像素的颜色值 |
pygame.Surface.get_palette() | 获取 Surface 对象 8 位索引的调色板 |
pygame.Surface.map_rgb() | 将一个 RGBA 颜色转换为映射的颜色值 |
pygame.Surface.set_clip() | 设置该 Surface 对象的当前剪切区域 |
pygame.Surface.subsurface() | 根据父对象创建一个新的子 Surface 对象 |
pygame.Surface.get_offset() | 获取子 Surface 对象在父对象中的偏移位置 |
pygame.Surface.get_size() | 获取 Surface 对象的尺寸 |
# Screen
# 绘制对象
screen.blit(source, dest, area=None, special_flags = 0)
- source:表示要粘贴的 Surface 对象。
- dest:主窗口中的一个标识的坐标位置,可以接受一个 (x,y) 元组,或者 (x,y,width,height) 元组,也可以是一个 Rect 对象;
- area:接受一个 Rect 对象,默认为 None,如果提供该参数则相当于抠图操作,即在屏幕的指定区域显示想要的内容;
- special_flags:可选参数,它是 Pygame.1.8 版本新增的功能,用于指定对应位置颜色的混合方式,参数值有 BLEND_RGBA_ADD、BLEND_SUB 等。如果不提供该参数的情况下,默认使用 source 的颜色覆盖 screen 的颜色。
# 创建主窗口
screen = pygame.display.set_mode(size=(),flags=0)
两个参数常用参数:
- size:元组参数,用来设置主窗口的大小
- flags:功能标志位,表示创建的主窗口样式,比如创建全屏窗口、无边框窗口等,flags 参数值见下表。
标志位 | 功能 |
---|---|
pygame.FULLSCREEN | 创建一个全屏窗口。 |
pygame.HWSURFACE | 创建一个硬件加速窗口,必须和 FULLSCREEN 同时使用。 |
pygame.OPENGL | 创建一个OPENGL渲染窗口。 |
pygame.RESIZABLE | 创建一个可以改变大小的窗口。 |
pygame.DOUBLEBUF | 创建一个双缓冲区窗口,建议在 HWSURFACE 或者 OPENGL 时使用。 |
pygame.NOFRAME | 创建一个没有边框的窗口。 |
# Display
方法名称 | 说明 |
---|---|
pygame.display.get_surface() | 获取当前显示的 Surface 对象。 |
pygame.display.flip() | 更新整个待显示的 Surface 对象到屏幕上。 |
pygame.display.update() | 更新部分软件界面显示。 |
pygame.display.Info() | 产生一个 VideoInfo 对象,包含了显示界面的相关信息。 |
pygame.display.set_icon() | 设置左上角的游戏图标,图标尺寸大小为 32*32。 |
pygame.display.iconify() | 将显示的主窗口即 Surface 对象最小化,或者隐藏。 |
pygame.display.get_active() | 当前显示界面显示在屏幕上时返回 True |
# Rect
rect =pygame.Rect(left,top,width,height)
创建一个指定位置和大小的矩形区域。Rect 表示的区域必须位于一个 Surface 对象之上,比如游戏的主窗口(screen), 其左上角为坐标原点
方法 | 说明 |
---|---|
pygame.Rect.copy() | 复制矩形 |
pygame.Rect.move() | 移动矩形区域,接受一个列表参数 |
pygame.Rect.move_ip() | 移动矩形(无返回) |
pygame.Rect.inflate() | 增大或缩小矩形大小 |
pygame.Rect.clamp() | 将矩形移到另一个矩形内 |
pygame.Rect.union() | 返回一个两个矩形合并后的矩形。 |
pygame.Rect.fit() | 按纵横比调整矩形的大小或移动矩形。 |
pygame.Rect.contains() | 测试一个矩形是否在另一个矩形内 |
pygame.Rect.collidepoint() | 测试点是否在矩形内 |
pygame.Rect.colliderect() | 测试两个矩形是否重叠 |
常用属性
x,y 表示矩形距离 x、y 轴的距离
top, left, bottom, right #在坐标系内描述矩形的大小
topleft, bottomleft, topright, bottomright #返回一个描述矩形大小的元组
midtop, midleft, midbottom, midright #返回一个描述矩形大小的元组
center, centerx, centery #(centerx,centery)表示矩形中央坐标(x,y)的值
size, width, height
w,h #用于描述矩形的width、height
# Draw
在 Surface 对象上绘制一些简单的形状,返回值是一个 Rect 对象,表示实际绘制图形的矩形区域
方法 | 说明 |
---|---|
pygame.draw.rect() | 绘制矩形 |
pygame.draw.polygon() | 绘制多边形 |
pygame.draw.circle() | 根据圆心和半径绘制圆形 |
pygame.draw.ellipse() | 绘制一个椭圆形 |
pygame.draw.arc() | 绘制弧线(挥着椭圆的一部分) |
pygame.draw.line() | 绘制线段(直线) |
pygame.draw.lines() | 绘制多条连续的线段 |
pygame.draw.aaline() | 绘制一条平滑的线段(抗锯齿) |
pygame.draw.aalines() | 绘制多条连续的线段 |
绘制矩形
pygame.draw.rect(surface, color, rect, width)
- surface:指游戏窗口
- color:该参数用于该图形着色;
- rect:绘制图形的位置和尺寸大小;
- width:可选参数,指定边框的宽度,默认为 0,表示填充该矩形区域。
当 width > 0 时,表示线框的宽度;而 width < 0 时,此时不会绘制任何图形。
绘制多边形
pygame.draw.polygon(surface, color, points, width)
points 一个列表参数,它表示组成多边形顶点的 3 或者多个 (x,y) 坐标,通过元组或者列表来表示这些多边形顶点。其余参数与上述函数相同。
# 主循环
任务:
- 处理游戏事件
- 更新游戏状态
- 刷新屏幕
刷新界面显示
pygame.display.flip()
pygame.display.update()
后者可以根据选定的区域来更新部分内容,而前者则是更新整个待显示的内容。如果后者没有提供区域位置参数时,其作用和 display.flip() 相同。
while True:
# 循环获取事件,监听事件
for event in pygame.event.get():
# 判断用户是否点了关闭按钮
if event.type == pygame.QUIT:
pygame.quit()
sys.exit() #终止系统
#更新并绘制屏幕内容
pygame.display.flip()
# Event
使用 Pygame 处理事件时,逻辑一般都是相似的。首先是判断事件的类型,然后根据不同的事件操作,执行不同的游戏操作
示例
# 循环获取事件,监听事件状态,使用get()获取事件
for event in pygame.event.get(): # 判断事件类型,用户是否点了"X"关闭按钮
# pygame.QUIT 指点击右上角窗口的"X"号,点击后,卸载所有pygame模块
if event.type == pygame.QUIT:
pygame.quit()
while True:
#等待事件发生
event = pygame.event.wait()
if event.type == pygame.QUIT:
exit()
if event.type == pygame.MOUSEBUTTONDOWN:
print('鼠标按下',event.pos)
if event.type == pygame.MOUSEBUTTONUP:
print('鼠标弹起')
if event.type == pygame.MOUSEMOTION:
print('鼠标移动')
# 键盘事件
if event.type ==pygame.KEYDOWN:
# 打印按键的英文字符
print('键盘按下',chr(event.key))
if event.type == pygame.KEYUP:
print('键盘弹起')
....
事件类型 | 描述 | 成员属性 |
---|---|---|
QUIT | 用户按下窗口的关闭按钮 | none |
ATIVEEVENT | Pygame被激活或者隐藏 | gain,state |
KEYDOWN | 键盘按下 | unicode、key、mod |
KEYUP | 键盘放开 | key、mod |
MOUSEMOTION | 鼠标移动 | pos, rel, buttons |
MOUSEBUTTONDOWN | 鼠标按下 | pos, button |
MOUSEBUTTONUP | 鼠标放开 | pos, button |
键盘事件
常量名 | 描述 |
---|---|
K_BACKSPACE | 退格键(Backspace) |
K_TAB | 制表键(Tab) |
K_CLEAR | 清除键(Clear) |
K_RETURN | 回车键(Enter) |
K_PAUSE | 暂停键(Pause) |
K_ESCAPE | 退出键(Escape) |
K_SPACE | 空格键(Space) |
K_0…K_9 | 0…9 |
K_a…Kz | a…z |
鼠标事件
event.pos 相对于窗口左上角,鼠标的当前坐标值(x,y)
event.button 鼠标按下键编号(整数),左键为1,按下滚动轮2、右键为3,向前滚动滑轮4、向后滚动滑轮5
# Time
管理时间和游戏帧数
方法 | 说明 |
---|---|
pygame.time.get_ticks() | 以毫秒为单位获取时间 |
pygame.time.wait() | 使程序暂停一段时间 |
pygame.time.set_timer() | 创建一个定时器,即每隔一段时间,去执行一些动作 |
pygame.time.Clock() | 创建一个时钟对象来帮我们确定游戏要以多大的帧数运行 |
# FPS
FPS(游戏帧率)影响效果只有在动态图时才能显现出来,不过无论静态图还是动态图,它们的使用规则都是一样的, 通过 Clock() 方法来实现,该对象提供了以下常用方法:
方法 | 说明 |
---|---|
pygame.time.Clock.tick(fps) | 更新clock对象 |
pygame.time.Clock.get_time() | 获取上一个tick中的时间 |
pygame.time.Clock.get_fps() | 计算clock对象的帧率 |
# 素材
# Image
pygame.image.load("图片路径").convert()
上述方法将被加载的图像作为 Surface 对象来使用。之所以使用 convert()来转换被加载图片的像素格式,是为了提升 Pygame 对图片的处理速度,该操作能够保证图像的像素格式与图片的显示格式是相同的。
jpg 是不支持透明的,所以我们载入这类图片就用 convert();而 png 是支持透明的,所以载入就用 convert_alpha()。
# Audio
# 加载音乐
pygame.mixer.music.load("music.mp3")
# 播放音乐
pygame.mixer.music.play(-1)
# Font
方法 | 说明 |
---|---|
pygame.font.init() | 初始化字体模块 |
pygame.font.quit() | 取消初始化字体模块 |
pygame.font.get_init() | 检查字体模块是否被初始化,返回一个布尔值。 |
pygame.font.get_default_font() | 获得默认字体的文件名。返回系统中字体的文件名 |
pygame.font.get_fonts() | 获取所有可使用的字体,返回值是所有可用的字体列表 |
pygame.font.match_font() | 从系统的字体库中匹配字体文件,返回值是完整的字体文件路径 |
pygame.font.SysFont() | 从系统的字体库中创建一个 Font 对象 |
pygame.font.Font() | 从一个字体文件创建一个 Font 对象 |
# 创建
# font.SysFont()
pygame.font.SysFont(name, size, bold=False, italic=False)
name:列表参数值,表示要从系统中加载的字体名称,它会按照列表中的元素顺序依次搜索,如果系统中没有列表中的字体,将使用 Pygame 默认的字体。
如果要显示中文,那么一定要使用中文字体文件,比如“方正粗黑宋简体”,否则会出现文字乱码的现象
# font.Font()
my_font = pygame.font.Font(filename, size)
方法 | 说明 |
---|---|
pygame.font.Font.render() | 该函数创建一个渲染了文本的 Surface 对象 |
pygame.font.Font.size() | 该函数返回渲染文本所需的尺寸大小,返回值是一个一元组 (width,height) |
pygame.font.Font.set_underline() | 是否为文本内容绘制下划线 |
pygame.font.Font.get_underline() | 检查文本是否绘制了下划线 |
pygame.font.Font.set_bold() | 启动粗体字渲染 |
pygame.font.Font.get_bold() | 检查文本是否使用粗体渲染 |
pygame.font.Font.set_italic() | 启动斜体字渲染 |
pygame.font.Font.metrics() | 获取字符串中每一个字符的详细参数 |
pygame.font.Font.get_italic() | 检查文本是否使用斜体渲染 |
pygame.font.Font.get_linesize() | 获取字体文本的行高 |
pygame.font.Font.get_height() | 获取字体的高度 |
pygame.font.Font.get_ascent() | 获取字体顶端到基准线的距离 |
pygame.font.Font.get_descent() | 获取字体底端到基准线的距离 |
# 设置
render(text, antialias, color, background=None)
- text:要绘制的文本内容
- antialias:布尔值参数,是否是平滑字体(抗锯齿)。
- color:设置字体颜色;
- background:可选参数,默认为 None,该参数用来设置字体的背景颜色。
# 逻辑
# Sprite
Sprite精灵是Pygame中的一个抽象概念,表示游戏中的可移动对象。可以通过继承pygame.sprite.Sprite
类来创建自己的Sprite对象
通过构建精灵组来统一管理精灵
# 创建精灵组
group = pygame.sprite.Group()
# 向组内添加一个精灵
group.add(sprite_one)
属性&方法 | 说明 |
---|---|
self.image | 加载要显示的精灵图片,控制图片大小和填充色 |
self.rect | 精灵图片显示在哪个位置 |
Sprite.update() | 刷新精灵图,使其相应效果生效 |
Sprite.add() | 添加精灵图到精灵组中(groups) |
Sprite.remove() | 从精灵组中删除选中的精灵图 |
Sprite.kill() | 删除精灵组中全部的精灵 |
Sprite.alive() | 判断某个精灵是否属于精灵组 |
# 碰撞检测
方法 | 说明 |
---|---|
pygame.sprite.collide_rect() | 两个精灵之间的矩形检测,即矩形区域是否有交汇,返回一个布尔值。 |
pygame.sprite.collide_circle() | 两个精灵之间的圆形检测,即圆形区域是否有交汇,返回一个布尔值。 |
pygame.sprite.collide_mask() | 两个精灵之间的像素蒙版检测,更为精准的一种检测方式。 |
pygame.sprite.spritecollide() | 精灵和精灵组之间的矩形碰撞检测,一个组内的所有精灵会逐一地对另外一个单个精灵进行碰撞检测,返回值是一个列表,包含了发生碰撞的所有精灵。 |
pygame.sprite.spritecollideany() | 精灵和精灵组之间的矩形碰撞检测,上述函数的变体,当发生碰撞时,返回组内的一个精灵,无碰撞发生时,返回 None。 |
pygame.sprite.groupcollide() | 检测在两个组之间发生碰撞的所有精灵,它返回值是一个字典,将第一组中发生碰撞的精灵作为键,第二个组中发生碰撞的精灵作为值。 |
# 高级