当前位置: 代码网 > it编程>前端脚本>Python > 2024年最全Python游戏工具包---Pygame最常用的15个模块详解(附pdf版本),字节跳动怎么面试的

2024年最全Python游戏工具包---Pygame最常用的15个模块详解(附pdf版本),字节跳动怎么面试的

2024年08月06日 Python 我要评论
别在网上瞎学了,我最近也做了一些资源的更新,只要你是我的粉丝,这期福利你都可拿走。我先来介绍一下这些东西怎么用,文末抱走。这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。最近我才对这些路线做了一下新的更新,知识体系更全面了。

做了那么多年开发,自学了很多门编程语言,我很明白学习资源对于学一门新语言的重要性,这些年也收藏了不少的python干货,对我来说这些东西确实已经用不到了,但对于准备自学python的人来说,或许它就是一个宝藏,可以给你省去很多的时间和精力。

别在网上瞎学了,我最近也做了一些资源的更新,只要你是我的粉丝,这期福利你都可拿走。

我先来介绍一下这些东西怎么用,文末抱走。


(1)python所有方向的学习路线(新版)

这是我花了几天的时间去把python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

最近我才对这些路线做了一下新的更新,知识体系更全面了。

在这里插入图片描述

(2)python学习视频

包含了python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。

在这里插入图片描述

(3)100多个练手项目

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。

在这里插入图片描述

(4)200多本电子书

这些年我也收藏了很多电子书,大概200多本,有时候带实体书不方便的话,我就会去打开电子书看看,书籍可不一定比视频教程差,尤其是权威的技术书籍。

基本上主流的和经典的都有,这里我就不放图了,版权问题,个人看看是没有问题的。

(5)python知识点汇总

知识点汇总有点像学习路线,但与学习路线不同的点就在于,知识点汇总更为细致,里面包含了对具体知识点的简单说明,而我们的学习路线则更为抽象和简单,只是为了方便大家只是某个领域你应该学习哪些技术栈。

在这里插入图片描述

(6)其他资料

还有其他的一些东西,比如说我自己出的python入门图文类教程,没有电脑的时候用手机也可以学习知识,学会了理论之后再去敲代码实践验证,还有python中文版的库资料、mysql和html标签大全等等,这些都是可以送给粉丝们的东西。

在这里插入图片描述

这些都不是什么非常值钱的东西,但对于没有资源或者资源不是很好的学习者来说确实很不错,你要是用得到的话都可以直接抱走,关注过我的人都知道,这些都是可以拿到的。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

一个人可以走的很快,但一群人才能走的更远!不论你是正从事it行业的老鸟或是对it行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

初始化后,pygame 将自动从几个内部的显示后端中选择一个。显示模式由平台和当前用户权限决定。在 display 模块被初始化之前,可以通过环境变量 sdl_videodriver 设置哪一个显示后端将被使用。具有多种显示后端的系统如下:

windows : windib, directx

unix : x11, dga, fbcon, directfb, ggi, vgl, svgalib, aalib

在一些平台上,可以将 pygame 的 display 嵌入到已经存在的窗口中。如果这么做,环境变量 sdl_windowid 必须被设置为一个包含窗口 id 或句柄的字符串。当 pygame 的 display 被初始化的时候,将检测环境变量。注意,在一个运行的窗口嵌入 display 会产生许多奇怪的副作用。

多次调用该函数并没有任何问题,但也不会有什么效果。

pygame.display.quit()

结束 display 模块。

quit() -> none

这个函数会关闭整个 display 模块。这将意味着任何一个活跃的显示界面都将被关闭。当主程序退出时,该函数也会被自动调用。

多次调用该函数并没有任何问题,但也不会有什么效果。

pygame.display.get_init()

如果 display 模块已经初始化,返回 true。

get_init() -> bool

如果 display 模块已经初始化,返回 true。

**pygame.display.set_mode()**初始化一个准备显示的窗口或屏幕。

set_mode(resolution=(0,0), flags=0, depth=0) -> surface

这个函数将创建一个 surface  对象的显示界面。传入的参数用于指定显示类型。最终创建出来的显示界面将是最大可能地匹配当前操作系统。

resolution 参数是一个二元组,表示宽和高。flags 参数是附件选项的集合。depth 参数表示使用的颜色深度。

返回的 surface  对象可以像常规的 surface  对象那样去绘制,但发生的改变最终会显示到屏幕上。

如果没有传入 resolution 参数,或者使用默认设置 (0, 0),且 pygame 使用 sdl1.2.10 以上版本,那么创建出来的 surface 对象将与当前屏幕用户一样的分辨率。如果只有宽或高其中一项被设置为 0,那么 surface 对象将使用屏幕分辨率的宽或高代替它。如果 sdl 版本低于 1.2.10,那么将抛出异常。

通常来说,最好的做法是不要传递 depth 参数。因为默认 pygame 会根据当前操作系统选择最好和最快的颜色深度。如果你的游戏确实需要一个特殊的颜色格式,那么你可以通过控制 depth 参数来实现。pygame 将为模拟一个非现成的颜色深度而耗费更多的时间。

当使用全屏显示模式的时候,有时候无法完全匹配到需要的分辨率。在这种情况下,pygame 将自动选择最匹配的分辨率使用,而返回的 surface  对象将保持与需求的分辨率一致。

flags 参数指定你想要的显示类型。提供几个选择给你,你可以通过位操作同时使用多个类型(管道操作符 “|”)。如果你传入 0 或没有传入 flags 参数,默认会使用软件驱动窗口。这儿是 flags 参数提供的几个可选项:

| 选项 | 含义 |

| — | — |

| pygame.fullscreen | 创建一个全屏显示 |

| pygame.doublebuf | 1. 双缓冲模式 2. 推荐和 hwsurface 或 opengl 一起使用 |

| pygame.hwsurface | 硬件加速,只有在 fullscreen 下可以使用 |

| pygame.opengl | 创建一个 opengl 渲染的显示 |

| pygame.resizable | 创建一个可调整尺寸的窗口 |

| pygame.noframe | 创建一个没有边框和控制按钮的窗口 |

举个例子:

# 在屏幕中创建一个 700 * 400 的窗口

screen_width=700

screen_height=400

screen=pygame.display.set_mode([screen_width, screen_height])

**pygame.display.get_surface()**获取当前显示的 surface 对象。

get_surface() -> surface

返回当前显示的 surface  对象。如果没有设置任何显示模式,那么返回 none。

**pygame.display.flip()**更新整个待显示的 surface 对象到屏幕上。

flip() -> none

这个函数将更新整个显示界面的内容。如果你的显示模式使用了 pygame.hwsurface(硬件加速)和 pygame.doublebuf(双缓冲)标志,那么将等待垂直会扫并切换显示界面。如果你使用不同类型的显示模式,那么它将简单的更新整个显示界面的内容。

当使用 pygame.opengl(使用 opengl 渲染)显示模式时,将创建一个 gl 缓冲切换区。

温馨提示:垂直回扫是与视频显示相关的时间测量,它代表了一个帧的结束和下一帧的开始时间之间的时间间隔。

**pygame.display.update()**更新部分软件界面显示。

update(rectangle=none) -> none

update(rectangle_list) -> none

这个函数可以看作是 pygame.display.flip() 函数在软件界面显示的优化版。它允许更新屏幕的部分内容,而不必完全更新。如果没有传入任何参数,那么该函数就像 pygame.display.flip() 那样更新整个界面。

你可以传递一个或多个矩形区域给该函数。一次性传递多个矩形区域比多次传递更有效率。如果传入的是一个空列表或者 none,那么将忽略参数。

该函数不能在 pygame.opengl 显示模式下调用,否则会抛出异常。

**pygame.display.get_driver()**获取 pygame 显示后端的名字。

get_driver() -> name

初始化的时候,pygame 会从多个可用的显示后端中选择一个。这个函数返回显示后端内部使用的名字。可以用来提供有关显示性能加速的一些信息。可以参考 pygame.display.set_mode() 的 sdl_videodriver 环境变量。

**pygame.display.info()**创建有关显示界面的信息对象。

info() -> videoinfo

创建一个对象,包含对当前图形环境一些属性的描述。在一些平台上,如果这个函数在 pygame.display.set_mode() 前被调用,可以提供一些关于默认显示模式的信息。也可以在设置完显示模式后调用该函数,以确认显示选项是否如愿以偿。

返回的 videoinfo 对象包含以下这些属性:

| 属性 | 含义 |

| — | — |

| hw | 如果是 true,则表示启用硬件加速 |

| wm | 如果是 true,则表示显示窗口模式 |

| video_mem | 表示显存是多少兆字节(mb),0 表示不清楚 |

| bitsize | 表示每个像素存放多少位 |

| bytesize | 表示每个像素存放多少字节 |

| masks | 4 个值用于打包像素的 rgba 值 |

| shifts | 4 个值用于打包像素的 rgba 值 |

| losses | 4 个值用于打包像素的 rgba 值 |

| blit_hw | 如果是 true,则表示加速硬件驱动的 surface  对象绘制 |

| blit_hw_cc | 如果是 true,则表示加速硬件驱动的 surface 对象 colorkey 绘制 |

| blit_hw_a | 如果是 true,则表示加速硬件驱动的 surface  对象 pixel alpha 绘制 |

| blit_sw | 如果是 true,则表示加速软件驱动的 surface 对象绘制 |

| blit_sw_cc | 如果是 true,则表示加速软件驱动的 surface 对象 colorkey 绘制 |

| blit_sw_a | 如果是 true,则表示加速软件驱动的surface 对象 pixel alpha 绘制 |

| current_w, current_h | 1. 表示当前显示模式的宽和高(如果在 display.set_mode() 前被调用,则表示当前桌面的宽和高)2. current_w, current_h 在 pygame 1.8.0 以后,sdl 1.2.10 以后才支持3. -1 表示错误,或者 sdl 版本太旧 |

**pygame.display.get_wm_info()**获取关于当前窗口系统的信息。

get_wm_info() -> dict

创建一个由操作系统填充数据的字典。一些操作系统可能不会往里边填充信息,则返回一个空字典。大多数平台将返回一个 “window” 键,对应的值是当前显示界面的系统 id。

pygame 1.7.1 新增加的。

pygame.display.list_modes() 获取全屏模式下可使用的分辨率。

list_modes(depth=0, flags=pygame.fullscreen) -> list

这个函数返回一个列表,包含指定颜色深度所支持的所有分辨率。如果显示模式非全屏,则返回一个空列表。如果返回 -1 表示支持任何分辨率(类似于窗口模式)。返回的列表由大到小排列。

如果颜色深度是 0,sdl 将选择当前/最合适的颜色深度显示。flags 参数默认值是 pygame.fullscreen,但你可能需要添加额外的全屏模式标志。

**pygame.display.mode_ok()**为显示模式选择最合适的颜色深度。

mode_ok(size, flags=0, depth=0) -> depth

这个函数使用与 pygame.display.set_mode() 函数一样的参数。一般用于判断一个显示模式是否可用。如果显示模式无法设置,则返回 0。正常情况下将会返回显示需求的像素深度。

通常不用理会 depth 参数,除非一些支持多个显示深度的平台,它会提示哪个颜色深度是更合适的。

最有用的 flags 参数是 pygame.hwsurface,pygame.doublebuf 和 pygame.fullscreen。如果这些标志不支持,那么该函数会返回 0。

**pygame.display.gl_get_attribute()**获取当前显示界面 opengl 的属性值。

gl_get_attribute(flag) -> value

在调用设置了 pygame.opengl 标志的 pygame.display.set_mode() 函数之后,检查 opengl 的属性值不失为一个好的习惯。参考 pygame.display.gl_set_attribute() 关于合法标志的列表。

**pygame.display.gl_set_attribute()**设置当前显示模式的 opengl 属性值。

gl_set_attribute(flag, value) -> none

当调用设置了 pygame.opengl 标志的 pygame.display.set_mode() 函数时,pygame 会自动设置 opengl 的一些属性值,例如颜色和双缓冲区。opengl 其实还提供了其他一些属性值供你控制。在 flag 参数中传入属性名,并将其值设置在 value 参数中。这个函数必须在 pygame.display.set_mode() 前设置。

这些 opengl 标志是:

gl_alpha_size, gl_depth_size, gl_stencil_size, gl_accum_red_size, gl_accum_green_size,  gl_accum_blue_size, gl_accum_alpha_size, gl_multisamplebuffers, gl_multisamplesamples, gl_stereo

**pygame.display.get_active()**当前显示界面显示在屏幕上时返回 true。

get_active() -> bool

pygame.display.set_mode() 函数被调用之后,surface 对象将被显示在屏幕上。大多数窗口都支持隐藏,如果显示的 surface  对象被隐藏和最小化,那么该函数将返回 false。

**pygame.display.iconify()**最小化显示的 surface  对象。

iconify() -> bool

将显示的surface 对象最小化或隐藏。并不是所有的操作系统都支持最小化显示界面。如果该函数调用成功,返回 true。

当显示界面最小化时,pygame.display.get_active() 返回 false。事件队列将接收到 activeevent 事件。

pygame.display.toggle_fullscreen() 切换全屏模式和窗口模式。

toggle_fullscreen() -> bool

切换全屏模式和窗口模式。这个函数只在 unix x11 显示驱动下工作。在大多数情况下,建议调用 pygame.display.set_mode() 创建一个新的显示模式进行切换。

**pygame.display.set_gamma()**修改硬件显示的 gama 坡道。

set_gamma(red, green=none, blue=none) -> bool

设置硬件驱动显示的红色、绿色和蓝色伽马值。如果没有传递 green 和 blue 参数,它们将与 red 值相等。不是所有的操作系统和硬件都支持伽马坡道。如果函数修改成功,则返回 true。

伽马值为 1.0 创建一个线性颜色表,较低的值会使屏幕变暗,较高的值会使屏幕变量。

**pygame.display.set_gamma_ramp()**自定义修改硬件显示的 gama 坡道

set_gamma_ramp(red, green, blue) -> bool

使用自定义表设置硬件驱动显示的红色、绿色和蓝色伽马坡道。每个参数必须是 256 位整数的列表。每位整数应该在 0 和 0xffff 之间。不是所有的操作系统和硬件都支持伽马坡道。如果函数修改成功,则返回 true。

**pygame.display.set_icon()**修改显示窗口的图标。

set_icon(surface) -> none

设置显示窗口执行时的图标。所有的操作系统默认都是以简单的 pygame logo 作为图标。

你可以传入任何 surface  对象作为图标,但大多数操作系统要求图标的大小是 32 * 32。图标可以设置 colorkey 透明度。

一些操作系统不允许修改显示中的窗口图标。对于这类操作系统,该函数需要再调用 pygame.display.set_mode() 前先创建并设置图标。

**pygame.display.set_caption()**设置当前窗口的标题栏。

set_caption(title, icontitle=none) -> none

如果显示窗口拥有一个标题栏,这个函数将修改窗口标题栏的文本。一些操作系统支持最小化窗口时切换标题栏,通过设置 icontitle 参数实现。

**pygame.display.get_caption()**获取当前窗口的标题栏。

get_caption() -> (title, icontitle)

返回当前窗口的标题栏和最小化标题栏,通常这两个值是一样的。

**pygame.display.set_palette()**设置显示界面的调色板。

set_palette(palette=none) -> none

这个函数将修改显示界面的 8 位调色板。这不会改变surface 对象实际的调色板,仅用于 surface 对象的显示。如果没有传入参数,将恢复系统默认调色板。调色板是一组 rgb 三元组序列。

3.draw 模块

=========

pygame.draw pygame 中绘制图形的模块。

函数

  • 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()  —  绘制多条连续的线段(抗锯齿)

该模块用于在 surface 对象上绘制一些简单的形状。这些函数将渲染到任何格式的 surface 对象上。硬件渲染会比普通的软件渲染更耗时。

大部分函数用 width 参数指定图形边框的大小,如果 width = 0 则表示填充整个图形。

所有的绘图函数仅能在 surface 对象的剪切区域生效。这些函数返回一个 rect,表示包含实际绘制图形的矩形区域。

大部分函数都有一个 color 参数,传入一个表示 rgb 颜色值的三元组,当然也支持 rgba 四元组。其中的 a 是 alpha 的意思,用于控制透明度。不过该模块的函数并不会绘制透明度,而是直接传入到对应 surface  对象的 pixel alphas 中。color 参数也可以是已经映射到 surface  对象的像素格式中的整型像素值。

当这些函数在绘制时,必须暂时锁定 surface  对象。许多连续绘制的函数可以通过一次性锁定直到画完再解锁来提高效率。

**函数详解****pygame.draw.rect()**绘制矩形。

rect(surface, color, rect, width=0) -> rect

在 surface  对象上绘制一个矩形。rect 参数指定矩形的位置和尺寸。width 参数指定边框的宽度,如果设置为 0 则表示填充该矩形。

**pygame.draw.polygon()**绘制多边形。

polygon(surface, color, pointlist, width=0) -> rect 在 surface  对象上绘制一个多边形。pointlist 参数指定多边形的各个顶点。width 参数指定边框的宽度,如果设置为 0 则表示填充该矩形。

绘制一个抗锯齿的多边形,只需要将 aalines() 的 closed 参数设置为 true 即可。

**pygame.draw.circle()**根据圆心和半径绘制圆形。

circle(surface, color, pos, radius, width=0) -> rect

在 surface  对象上绘制一个圆形。pos 参数指定圆心的位置,radius 参数指定圆的半径。width 参数指定边框的宽度,如果设置为 0 则表示填充该矩形。

**pygame.draw.ellipse()**根据限定矩形绘制一个椭圆形。

ellipse(surface, color, rect, width=0) -> rect

在 surface  对象上绘制一个椭圆形。rect 参数指定椭圆外围的限定矩形。width 参数指定边框的宽度,如果设置为 0 则表示填充该矩形。

**pygame.draw.arc()**绘制弧线。

arc(surface, color, rect, start_angle, stop_angle, width=1) -> rect

在 surface  对象上绘制一条弧线。rect 参数指定弧线所在的椭圆外围的限定矩形。两个 angle 参数指定弧线的开始和结束位置。width 参数指定边框的宽度。

**pygame.draw.line()**绘制线段。

line(surface, color, start_pos, end_pos, width=1) -> rect

在 surface  对象上绘制一条线段。两端以方形结束。

**pygame.draw.lines()**绘制多条连续的线段。

lines(surface, color, closed, pointlist, width=1) -> rect

在 surface  对象上绘制一系列连续的线段。pointlist 参数是一系列短点。如果 closed 参数设置为 true,则绘制首尾相连。

**pygame.draw.aaline()**绘制抗锯齿的线段。

aaline(surface, color, startpos, endpos, blend=1) -> rect

在 surface  对象上绘制一条抗锯齿的线段。blend 参数指定是否通过绘制混合背景的阴影来实现抗锯齿功能。该函数的结束位置允许使用浮点数。

**pygame.draw.aalines()**绘制多条连续的线段(抗锯齿)。

aalines(surface, color, closed, pointlist, blend=1) -> rect

在 surface  对象上绘制一系列连续的线段(抗锯齿)。如果 closed 参数为 true,则首尾相连。blend 参数指定是否通过绘制混合背景的阴影来实现抗锯齿功能。该函数的结束位置允许使用浮点数。

image

# 公众号:一行数据

import pygame

import sys

import math

from pygame.locals import *

pygame.init()

white = (255, 255, 255)

black = (0, 0, 0)

green = (0, 255, 0)

red = (255, 0, 0)

blue = (0, 0, 255)

points = [(200, 175), (300, 125), (400, 175), (450, 125), (450, 225), (400, 175), (300, 225)]

size = width, height = 640, 1000

screen = pygame.display.set_mode(size)

pygame.display.set_caption(“python demo”)

clock = pygame.time.clock()

while true:

for event in pygame.event.get():

if event.type == quit:

sys.exit()

screen.fill(white)

pygame.draw.rect(screen, black, (50, 30, 150, 50), 0)

pygame.draw.rect(screen, black, (250, 30, 150, 50), 1)

pygame.draw.rect(screen, black, (450, 30, 150, 50), 10)

pygame.draw.polygon(screen, green, points, 0)

pygame.draw.circle(screen, red, (320, 400), 25, 1)

pygame.draw.circle(screen, green, (320, 400), 75, 1)

pygame.draw.circle(screen, blue, (320, 400), 125, 1)

pygame.draw.ellipse(screen, black, (100, 600, 440, 100), 1)

pygame.draw.ellipse(screen, black, (220, 550, 200, 200), 1)

pygame.draw.arc(screen, black, (100, 800, 440, 100), 0, math.pi, 1)

pygame.draw.arc(screen, black, (220, 750, 200, 200), math.pi, math.pi * 2, 1)

pygame.display.flip()

clock.tick(10)

4.event模块

=========

pygame.event用于处理事件与事件队列的 pygame 模块。

函数

  • pygame.event.pump()  —  让 pygame 内部自动处理事件

  • pygame.event.get()  —  从队列中获取事件

  • pygame.event.poll()  —  从队列中获取一个事件

  • pygame.event.wait()  —  等待并从队列中获取一个事件

  • pygame.event.peek()  —  检测某类型事件是否在队列中

  • pygame.event.clear()  —  从队列中删除所有的事件

  • pygame.event.event_name()  —  通过 id 获得该事件的字符串名字

  • pygame.event.set_blocked()  —  控制哪些事件禁止进入队列

  • pygame.event.set_allowed()  —  控制哪些事件允许进入队列

  • pygame.event.get_blocked()  —  检测某一类型的事件是否被禁止进入队列

  • pygame.event.set_grab()  —  控制输入设备与其他应用程序的共享

  • pygame.event.get_grab()  —  检测程序是否共享输入设备

  • pygame.event.post()  —  放置一个新的事件到队列中

  • pygame.event.event()  —  创建一个新的事件对象

  • pygame.event.eventtype  —  代表 sdl 事件的 pygame 对象 pygame 通过事件队列控制所有的时间消息。该模块中的程序将帮你管理事件队列。输入队列很大程度依赖于 pygame 的 display 模块。如果 display 没有被初始化,显示模式没有被设置,那么事件队列就还没有开始真正工作。

常规的队列是由 pygame.event.eventtype 定义的事件对象的组成,有多种方法来访问里边的事件对象:从简单的检测事件是否存在,到直接从栈中获取它们。

所有事件都有一个类型标识符,这个标识符对应的值定义在 noevent 到 numevents 之间(温馨提示:类似于 c 语言的宏定义,明白?)。用户可以自行定义事件,但类型标识符的值应该高于或等于 userevent。

获取各种输入设备的状态,推荐你直接通过它们相应的模块(mouse,key 和 joystick)提供的函数访问,而不是通过事件队列;如果你使用此函数,请记住,pygame 需要通过一些方式与系统的窗口管理器和平台的其他部分进行通信。为了保持 pygame 和系统同步,你需要调用 pygame.event.pump() 确保实时更新,你将在游戏的每次循环中调用这个函数。

事件队列提供了一些简单的过滤。通过阻止某些事件进入事件队列,可以略微提高游戏的性能(温馨提示:因为这样事件队列的尺寸就会小一些,所以说可以略微提升性能)。使用 pygame.event.set_allowed() 和 pygame.event.set_blocked() 来控制某些事件是否允许进入事件队列。默认所有事件都会进入事件队列。

事件子系统应该在主线程被调用。如果你希望从其他线程中投递事件消息进入事件队列,请使用 fastevent 包。

joysticks(游戏手柄)只有在设备初始化后才会发送事件。

一个 eventtype 事件对象包含一个事件类型标识符和一组成员数据(事件对象不包含方法,只有数据)。eventtype 对象从 python 的事件队列中获得,你也可以使用 pygame.event.event() 函数创建自定义的新事件。

由于 sdl 的事件队列限制了事件数量的上限(标准的 sdl 1.2 限制为 128),所以当队列已满时,新的事件将会被扔掉。为了防止丢失事件消息,尤其是代表退出的输入事件(因为当用户点击退出按钮没有反应,往往会被认为“死机”了),你的程序必须定期检测事件,并对其进行处理。

为了加快事件队列的处理速度,可以使用 pygame.event.set_blocked() 函数阻止一些我们不关注的事件进入队列中。

所有的 eventtype 实例对象都拥有一个事件类型标识符,属性名是 type。你也可以通过事件对象的 dict 属性来完全访问其他属性。所有其他成员属性的值都是通过事件对象的字典来传递。

5.font模块

========

pygame.fontpygame 中加载和表示字体的模块。

函数

  • 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 对象 字体模块可以在一个新的 surface 对象上表示 truetype 字体。它接受所有 ucs-2 字符(‘u0001’ 到 ‘uffff’)。此模块为可选择模块,并且依赖于 sdl_ttf。在使用之前,你需要先测试该模块是否可用,而且对其进行初始化。

通过使用现有的 font 对象,可以完成大多数与字体有关的工作。pygame.font 模块自身仅可以完成常规的初始化以及通过 pygame.font.font() 创建 font 对象。

你可以通过使用 pygame.font.sysfont() 函数从系统内加载字体。另外还有其他几个函数可以帮助你搜索系统的字体。

pygame 配备了内建的默认字体。通过传递 “none” 为文件名访问此字体。

在 pygame 第一次导入之前,当pygame.font 模块确定环境变量 pygame_freetype 时使用基于 pygame.ftfont 的 pygame.freetype 模块。pygame.ftfont 是一个pygame.font 可兼容模块,兼容绝大部分,除开其中某个字体模块单元测试:pygame.ftfont 并没有基于字体模块的 sdl_ttf 的 ucs-2 字符限制,所以对于大于 ‘uffff’ 的码点会产生异常。如果 pygame.freetype 是不可使用的,那么 sdl_ttf 字体模块将会被加载用于替代。

常用函数详解类 class pygame.font.font 从一个字体文件创建一个 font 对象。

font(filename, size) -> font

font(object, size) -> font

方法

  • pygame.font.font.render()  ——  在一个新 surface 对象上绘制文本

  • pygame.font.font.size()  ——  确定多大的空间用于表示文本

  • 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()  ——  获取字体底端到基准线的距离

  • 根据提供的文件名或者 python 文件对象加载一个新的字体。字体的高度是以像素为单位。如果文件名是 “none”,则加载 pygame 的默认字体。如果一个字体无法由给定的参数加载,将会产生一个异常。一旦字体已经创建完毕,那么字体的尺寸将不能修改。

字体对象主要被用于在新 surface 对象中渲染文本。文本可以渲染为仿真的粗体或者斜体特征,但最好是加载的字体本身就带有粗体或者斜体字形。可以用普通字符串或者 unicode 编码字符来渲染文本。

方法详解

pygame.font.font.render() 在一个新 surface 对象上绘制文本。

render(text, antialias, color, background=none) -> surface

该函数创建一个新的 surface 对象,并在上边渲染指定的文本。pygame 没有提供直接的方式在一个现有的 surface 对象上绘制文本,取而代之的方法是:使用 font.render() 函数创建一个渲染了文本的图像(surface 对象),然后将这个图像绘制到目标 surface 对象上。

仅支持渲染一行文本:“换行”字符不会被渲染。空字符(‘x00’)被渲染将产生一个 typeerror 错误。unicode 和 char(字节)字符串都可以被接受。对于 unicode 字符串,仅 ucs-2 字符范围(‘u0001’ 到 ‘uffff’)被认为是有效的。任何编码值更大字符的字符会产生一个 unicodeerror 的错误;对于 char 字符串,默认的是使用 latin1 编码。color 参数决定的是文本的颜色(例如:(0, 0, 255) 表示蓝色)。可选参数 background 决定了文本的背景颜色。如果没有传递 background 参数,则对应区域内表示的文本背景将会被设置为透明。

返回的 surface 对象将保持表示文本所需要的尺寸(与 font.size() 所返回的尺寸相同)。如果将一个空字符串渲染为文本,将会返回一个空白 surface 对象,它仅有一个像素点的宽度,但高度与字体高度一样。

由于取决于文本背景的类型和抗锯齿功能的使用,该函数将会返回不同类型的 surface 对象。出于性能上的考虑,了解何种类型的图像会被使用是很有帮助的:如果抗锯齿功能没有被使用,返回的图像将采用二元调色的 8 位图像。此时如果背景是透明的,只设置一个 colorkey 来实现;抗锯齿图像会被渲染为 24 位 rgb 图像。此时如果背景是透明的,每个像素都将包含一个 alpha 通道。

优化:如果你已知文本最终将绘制在一个纯色的背景上,那么文本是抗锯齿的,你可以通过指定文本的背景色来提高性能(将文本背景色设置目标 surface 对象的颜色)。使用这个技巧,你只需用一个 colorkey 即可保持透明信息,而不需要设置每个像素的 alpha 通道值(这样效率会低很多)。

如果你尝试渲染 ‘\n’,通常是显示为一个矩形(未知字符)。因此,你需要自己想办法处理换行。

字体渲染并不是线程安全的行为:在任何时候仅有一个线程可以渲染文本。

6.image模块

=========

pygame.image用于图像传输的 pygame 模块。

函数

  • pygame.image.load()  —  从文件加载新图片

  • pygame.image.save()  —  将图像保存到磁盘上

  • pygame.image.get_extended()  —  检测是否支持载入扩展的图像格式

  • pygame.image.tostring()  —  将图像转换为字符串描述

  • pygame.image.fromstring()  —  将字符串描述转换为图像

  • pygame.image.frombuffer()  —  创建一个与字符串描述共享数据的 surface 对象 image 模块包含了加载和保存图像的函数,同时转换为 surface 对象支持的格式。

注意:没有 image 类;当一个图像被成功载入后,将转换为 surface  对象。surface  对象允许你在上边画线、设置像素、捕获区域等。

image 是 pygame 相当依赖的一个模块,支持载入的图像格式如下:

  • jpg

  • png

  • gif(无动画)

  • bmp

  • pcx

  • tga(无压缩)

  • tif

  • lbm(和 pbm)

  • pbm(和 pgm,ppm)

  • xpm 支持保存为以下格式:

  • bmp

  • tga

  • png

  • jpeg 其中,保存为 png 和 jpeg 格式是 pygame 1.8 新增加的。

**函数详解****pygame.image.load()**从文件加载新图片。

load(filename) -> surface

load(fileobj, namehint=””) -> surface

从文件加载一张图片,你可以传递一个文件路径或一个 python 的文件对象。

pygame 将自动判断图像的格式(比如 gif 或位图)并创建一个新的 surface  对象。有时它可能需要知道文件的后缀名(比如 gif 图像应该以 “.gif” 为后缀)。如果你传入原始文件对象,你需要传入它对应的文件名到 namehint 参数中。

返回的 surface  对象将包含与源文件相同的颜色格式,colorkey 和 alpha 透明度通道。你通常需要调用 surface.convert() 函数进行转换,这样可以使得在屏幕上绘制的速度更快。

对于含有 alpha 通道的图片(支持部分位置透明,像 png 图像),需要使用 surface.convert_alpha() 函数进行转换。

在某些环境下,pygame 可能无法支持上述所有的图像格式,但至少无压缩的 bmp 格式是支持的。你可以调用 pygame.image.get_extended() 函数,如果返回 true,说明可以加载上述的格式(包含 png,jpg 和 gif)。

你应该使用 os.path.join() 提高代码的兼容性:

asurf = pygame.image.load(os.path.join(‘data’, ‘python.png’))

**pygame.image.save()**将图像保存到磁盘上。

save(surface, filename) -> none

该函数将保存 surface  对象到磁盘上,支持存储为 bmp,tga,png 或 jpeg 格式的图像。如果 filename 没有指定后缀名,那么默认是保存为 tga 格式。tga 和 bmp 格式是无压缩的文件。

保存为 png 和 jpeg 格式是 pygame 1.8 新增的。

**pygame.image.get_extended()**检测是否支持载入扩展的图像格式。

get_extended() -> bool

如果 pygame 支持上述所有的扩展图像格式,则返回 true。

**pygame.image.tostring()**将图像转换为字符串描述。

tostring(surface, format, flipped=false) -> string

将图像转换为一个字符串描述,可以被 python 的其他图像模块通过 “fromstring” 转换回图像。一些 python 图像模块喜欢“自下而上”的存储格式(例如 pyopengl)。如果 flipped 参数为 true,那么字符串将会垂直翻转以适用这类图像模块。

format 参数可以是下表中任何一个字符串。注意:只有 8 位的 surface  对象可以使用 “p” 格式。其他格式可以用于任何 surface  对象上。

**pygame.image.fromstring()**将字符串描述转换为图像。

fromstring(string, size, format, flipped=false) -> surface

该函数的使用跟 pygame.image.tostring() 相似。size 参数是一对表示宽度和高度的数字。一旦新的 surface 对象创建成功,你就可以删除字符串描述。

size 和 format 参数指定的数据需要跟字符串描述相符,否则将抛出异常。

更快地将图片转换到 pygame,请参考 pygame.image.frombuffer() 函数。

**pygame.image.frombuffer()**创建一个与字符串描述共享数据的 surface 对象。

frombuffer(string, size, format) -> surface

创建一个新的 surface 对象,与字符串描述直接共享像素数据。该函数的使用跟 pygame.image.fromstring() 类似,但没法垂直翻转原始数据。

该函数的速度会比 pygame.image.fromstring() 快很多,因为该函数不需要申请和拷贝任何像素数据。

7.key模块

=======

pygame.key与键盘相关的 pygame 模块。

函数

  • pygame.key.get_focused()  —  当窗口获得键盘的输入焦点时返回 true

  • pygame.key.get_pressed()  —  获取键盘上所有按键的状态

  • pygame.key.get_mods()  —  检测是否有组合键被按下

  • pygame.key.set_mods()  —  临时设置某些组合键为被按下状态

  • pygame.key.set_repeat()  —  控制重复响应持续按下按键的时间

  • pygame.key.get_repeat()  —  获取重复响应按键的参数

  • pygame.key.name()  —  获取按键标识符对应的名字 该模块包含处理与键盘操作相关的函数。当键盘按键被按下和释放时,事件队列将获得 pygame.keydown 和 pygame.keyup 事件消息。这两个消息均包含 key 属性,是一个整数的 id,代表键盘上具体的某个按键。

pygame.kyedown 事件还有个额外的属性 unicode 和 scancode。unicode 代表一个按键翻译后的 unicode 编码,这包含 shift 按键和组合键。scancode 是扫描码,不同键盘间该值可能不同。不过这对于特殊按键像多媒体键的选择是有用的。

温馨提示:当键盘按下的时候,键盘会发送一个扫描码给系统。扫描码是键盘反馈哪一个按键被按下的方式,不同类型的键盘扫描码不同。再由系统调用相应的函数将其转换为统一的 unicode 编码。

key 属性的值是一个数字,为了方便使用,pygame 将这些数字定义为以下这些常量:

| keyascii | ascii | 描述 |

| — | — | — |

| k_backspace | \b | 退格键(backspace) |

| k_tab | \t | 制表键(tab) |

| k_clear |

| 清楚键(clear) |

| k_return | \r | 回车键(enter) |

| k_pause |

| 暂停键(pause) |

| k_escape | ^[ | 退出键(escape) |

| k_space |

| 空格键(space) |

| k_exclaim | ! | 感叹号(exclaim) |

| k_quotedbl | " | 双引号(quotedbl) |

| k_hash | # | 井号(hash) |

| k_dollar | $ | 美元符号(dollar) |

| k_ampersand | & | and 符号(ampersand) |

| k_quote | ’ | 单引号(quote) |

| k_leftparen | ( | 左小括号(left parenthesis) |

| k_rightparen | ) | 右小括号(right parenthesis) |

| k_asterisk | * | 星号(asterisk) |

| k_plus | + | 加号(plus sign) |

| k_comma | , | 逗号(comma) |

| k_minus | - | 减号(minus sign) |

| k_period | . | 句号(period) |

| k_slash | / | 正斜杠(forward slash) |

| k_0 | 0 | 0 |

| k_1 | 1 | 1 |

| k_2 | 2 | 2 |

| k_3 | 3 | 3 |

| k_4 | 4 | 4 |

| k_5 | 5 | 5 |

| k_6 | 6 | 6 |

| k_7 | 7 | 7 |

| k_8 | 8 | 8 |

| k_9 | 9 | 9 |

| k_colon | : | 冒号(colon) |

| k_semicolon | ; | 分号(semicolon) |

| k_less | < | 小于号(less-than sign) |

| k_equals | = | 等于号(equals sign) |

| k_greater | > | 大于号(greater-than sign) |

| k_question | ? | 问号(question mark) |

| k_at | @ | at 符号(at) |

| k_leftbracket | [ | 左中括号(left bracket) |

| k_backslash | |反斜杠(backslash) |

|

| k_rightbracket | ] | 右中括号(right bracket) |

| k_caret | ^ | 脱字符(caret) |

| k_underscore | _ | 下划线(underscore) |

| k_backquote | ` | 重音符(grave) |

| k_a | a | a |

| k_b | b | b |

| k_c | c | c |

| k_d | d | d |

| k_e | e | e |

| k_f | f | f |

| k_g | g | g |

| k_h | h | h |

| k_i | i | i |

| k_j | j | j |

| k_k | k | k |

| k_l | l | l |

| k_m | m | m |

| k_n | n | n |

| k_o | o | o |

| k_p | p | p |

| k_q | q | q |

| k_r | r | r |

| k_s | s | s |

| k_t | t | t |

| k_u | u | u |

| k_v | v | v |

| k_w | w | w |

| k_x | x | x |

| k_y | y | y |

| k_z | z | z |

| k_delete |

| 删除键(delete) |

| k_kp0 |

| 0(小键盘) |

| k_kp1 |

| 1(小键盘) |

| k_kp2 |

| 2(小键盘) |

| k_kp3 |

| 3(小键盘) |

| k_kp4 |

| 4(小键盘) |

| k_kp5 |

| 5(小键盘) |

| k_kp6 |

| 6(小键盘) |

| k_kp7 |

| 7(小键盘) |

| k_kp8 |

| 8(小键盘) |

| k_kp9 |

| 9(小键盘) |

| k_kp_period | . | 句号(小键盘) |

| k_kp_divide | / | 除号(小键盘) |

| k_kp_multiply | * | 乘号(小键盘) |

| k_kp_minus | - | 减号(小键盘) |

| k_kp_plus | + | 加号(小键盘) |

| k_kp_enter | \r | 回车键(小键盘) |

| k_kp_equals | = | 等于号(小键盘) |

| k_up |

| 向上箭头(up arrow) |

| k_down |

| 向下箭头(down arrow) |

| k_right |

| 向右箭头(right arrow) |

| k_left |

| 向左箭头(left arrow) |

| k_insert |

| 插入符(insert) |

| k_home |

| home 键(home) |

| k_end |

| end 键(end) |

| k_pageup |

| 上一页(page up) |

| k_pagedown |

| 下一页(page down) |

| k_f1 |

| f1 |

| k_f2 |

| f2 |

| k_f3 |

| f3 |

| k_f4 |

| f4 |

| k_f5 |

| f5 |

| k_f6 |

| f6 |

| k_f7 |

| f7 |

| k_f8 |

| f8 |

| k_f9 |

| f9 |

| k_f10 |

| f10 |

| k_f11 |

| f11 |

| k_f12 |

| f12 |

| k_f13 |

| f13 |

| k_f14 |

| f14 |

| k_f15 |

| f15 |

| k_numlock |

| 数字键盘锁定键(numlock) |

| k_capslock |

| 大写字母锁定键(capslock) |

| k_scrollock |

| 滚动锁定键(scrollock) |

| k_rshift |

| 右边的 shift 键(right shift) |

| k_lshift |

| 左边的 shift 键(left shift) |

| k_rctrl |

| 右边的 ctrl 键(right ctrl) |

| k_lctrl |

| 左边的 ctrl 键(left ctrl) |

| k_ralt |

| 右边的 alt 键(right alt) |

| k_lalt |

| 左边的 alt 键(left alt) |

| k_rmeta |

| 右边的元键(right meta) |

| k_lmeta |

| 左边的元键(left meta) |

| k_lsuper |

| 左边的 window 键(left windows key) |

| k_rsuper |

| 右边的 window 键(right windows key) |

| k_mode |

| 模式转换键(mode shift) |

| k_help |

| 帮助键(help) |

| k_print |

| 打印屏幕键(print screen) |

| k_sysreq |

| 魔术键(sysrq) |

| k_break |

| 中断键(break) |

| k_menu |

| 菜单键(menu) |

| k_power |

| 电源键(power) |

| k_euro |

| 欧元符号(euro) |

还有一个 mod 属性,用于描述组合键状态。

以下是组合键的常量定义:

| keyascii | 描述 |

| — | — |

| kmod_none | 木有同时按下组合键 |

| kmod_lshift | 同时按下左边的 shift 键 |

| kmod_rshift | 同时按下右边的 shift 键 |

| kmod_shift | 同时按下 shift 键 |

| kmod_caps | 同时按下大写字母锁定键 |

| kmod_lctrl | 同时按下左边的 ctrl 键 |

| kmod_rctrl | 同时按下右边的 ctrl 键 |

| kmod_ctrl | 同时按下 ctrl 键 |

| kmod_lalt | 同时按下左边的 alt 键 |

| kmod_ralt | 同时按下右边的 alt 键 |

| kmod_alt | 同时按下 alt 键 |

| kmod_lmeta | 同时按下左边的元键 |

| kmod_rmeta | 同时按下右边的元键 |

| kmod_meta | 同时按下元键 |

| kmod_num | 同时按下数字键盘锁定键 |

| kmod_mode | 同时按下模式转换键 |

温馨提示:如果 mod & kmod_ctrl 是真的话,表示用户同时按下了 ctrl 键。

**函数详解****pygame.key.get_focused()**当窗口获得键盘的输入焦点时返回 true。

get_focused() -> bool

当窗口获得键盘的输入焦点时返回 true,如果窗口需要确保不失去键盘焦点,可以使用 pygame.event.set_grab(true) 独占所有的输入接口。

温馨提示:注意,这样做你就无法将鼠标移出窗口客户区了,但你仍然可以通过 ctrl - alt - delete 热键“解围”。

**pygame.key.get_pressed()**获取键盘上所有按键的状态。

get_pressed() -> bools

返回一个由布尔类型值组成的序列,表示键盘上所有按键的当前状态。使用 key 常量作为索引,如果该元素是 true,表示该按键被按下。

使用该函数获取一系列按钮被按下的状态,并不能正确的获取用户输入的文本。因为你无法知道用户按键的被按下的顺序,并且快速的连续按下键盘可能无法完全被捕获(在两次调用 pygame.key.get_pressed() 的过程中被忽略),也无法将这些按下的按键完全转化为字符值。实现此功能可以通过捕获 pygame.keydown 事件消息来实现。

**pygame.key.get_mods()**检测是否有组合键被按下。

get_mods() -> int

返回一个包含所有组合键位掩码的整数。使用位操作符 & 你可以检测某个组合键是否被按下。

温馨提示:假如 pygame.key.get_mods() 返回值存放在 mods 变量中,如果 mods & kmod_ctrl 为 true,表示 ctrl 键正被按下。

pygame.key.set_mods() 临时设置某些组合键为被按下状态。

set_mods(int) -> none

创建一个位掩码整数,包含你需要设置为被按下状态的组合键。

温馨提示:比如我们需要设置 ctrl 和 alt 组合键为按下状态,则可以 mods = kmod_ctrl | kmod_alt,然后调用 pygame.key.set_mods(mods),这样尽管用户没有按下 ctrl 和 alt 组合键,它们依然是显示被按下状态。

**pygame.key.set_repeat()**控制重复响应持续按下按键的时间。

set_repeat() -> none

set_repeat(delay, interval) -> none

当开启重复响应按键,那么用户持续按下某一按键,就会不断产生同一 pygame.keydown 事件。delay 参数设置多久后(单位是毫秒)开始发送第一个 pygame.keydown 事件。interval 参数设置发送两个事件之间的间隔。如果不传入任何参数,表示取消重复响应按键。

**pygame.key.get_repeat()**获取重复响应按键的参数。

get_repeat() -> (delay, interval)

当开启重复响应按键,那么用户持续按下某一按键,就会不断产生同一 pygame.keydown 事件。返回值是一个二元组,第一个元素 delay 表示多久后(单位是毫秒)开始发送第一个 pygame.keydown 事件。第二个元素 interval 表示发送两个事件之间的间隔。

默认情况下重复响应按键是没有开启的。

pygame 1.8 新增加的。

**pygame.key.name()**获取按键标识符对应的名字。

name(key) -> string

获取一个按键标识符对应的字符串描述

8.locals模块

==========

pygame.localspygame 定义的常量。

这个模块包含了 pygame 定义的各种常量。它的内容会被自动放入到 pygame 模块的名字空间中。你可以使用

from pygame.locals import将所有的 pygame 常量导入。

各个常量的详细描述记录在 pygame 各个模块的相关文档中。比如 pygame.display.set_mode() 方法用到的 hwsurface 常量,你就可以在 display 模块的文档中找到详细的说明;事件类型在 event 模块的文档中可以找到;当产生 keydown 或 keyup 事件时,key 属性描述具体哪个按键被按下,该值是以 k_ 开头的常量(mod_ 开头的常量表示各种组合键被按下),在 key 模块的文档中可以找到;最后,time_resolution 被定义在 time 模块中。

9.mixer模块

=========

pygame.mixer用于加载和播放声音的pygame模块

函数

  • pygame.mixer.init  —  初始化混音器模块

  • pygame.mixer.pre_init  —  预设混音器初始化参数

  • pygame.mixer.quit  —  卸载混音器模块

  • pygame.mixer.get_init  —  测试混音器是否初始化

  • pygame.mixer.stop  —  停止播放所有通道

  • pygame.mixer.pause  —  暂停播放所有通道

  • pygame.mixer.unpause  —  恢复播放

  • pygame.mixer.fadeout  —  淡出停止

  • pygame.mixer.set_num_channels  —  设置播放频道的总数

  • pygame.mixer.get_num_channels  —  获取播放频道的总数

  • pygame.mixer.set_reserved  —  预留频道自动使用

  • pygame.mixer.find_channel   —  找到一个未使用的频道

  • pygame.mixer.get_busy  —  测试混音器是否正在使用类

  • pygame.mixer.sound   —  从文件或缓冲区对象创建新的sound对象

  • pygame.mixer.channel   —  创建一个channel对象来控制播放

此模块包含用于加载 sound 对象和控制播放的类。混音器模块是可选的,取决于sdl_mixer。您的程序应该在使用它之前 测试 pygame.mixer 模块是否可用并进行初始化。

混音器模块具有有限数量的声音播放声道。通常程序会告诉 pygame 开始播放音频,它会自动选择一个可用的频道。默认为8个并发通道,但复杂的程序可以更精确地控制通道数量及其使用。

所有声音播放都混合在后台线程中。当您开始播放sound对象时,它会在声音继续播放时立即返回。单个sound对象也可以自动播放多次。

混音器还有一个特殊流通道用于音乐播放,可通过 pygame.mixer.music 模块访问。

混音器模块必须像其他 pygame 模块一样进行初始化,但它有一些额外的条件。pygame.mixer.init() 函数采用几个可选参数来控制播放速率和样本大小。pygame将 默认为合理的值,但pygame无法执行声音重采样,因此应初始化混音器以匹配音频资源的值。

注意:不要使用较少的延迟声音,请使用较小的缓冲区大小。 默认设置为减少某些计算机上发出沙哑声音的可能性。 您可以在 pygame.mixer.init() 或者 pygame.init() 之前 通过调用pygame.mixer.pre_init()预设混合器初始化参数来更改默认缓冲区。 例如:pygame.mixer.pre_init(44100,-16,2,1024)。在pygame 1.8中,默认大小从1024更改为3072。

函数详解pygame.mixer.init() 初始化混音器模块 init(frequency=22050, size=-16, channels=2, buffer=4096) -> none 初始化混音器模块以进行声音加载和播放。默认参数可以被改变以提供特定的音频混合。允许使用关键字参数。对于参数设置为零的向后兼容性,使用默认值(可能由pre_init调用更改)。

size参数表示每个音频样本使用的位数。如果值为负,则将使用带符号的样本值。正值表示将使用不带符号的音频样本。无效值会引发异常。

pygame 2中的新功能(使用sdl2编译时) - 大小可以是32(32位浮点数)。

channels参数用于指定是使用单声道还是立体声。1表示单声道,2表示立体声。不支持其他值(负值被视为1,大于2的值被视为2)。

buffer参数控制混音器中使用的内部采样数。默认值应适用于大多数情况。可以降低它以减少延迟,但可能会发生声音丢失。它可以被提升到更大的值,以确保播放永远不会跳过,但它会对声音播放施加延迟。缓冲区大小必须是2的幂(如果不是,则向上舍入到下一个最接近的2的幂)。

某些平台需要在 display 模块初始化后初始化pygame.mixer 模块。顶级pygame.init() 自动处理此问题,但无法将任何参数传递给 mixer init。为了解决这个问题,mixer 具有pygame.mixer.pre_init() 函数在使用顶层初始化之前设置正确默认值。

多次调用是安全的,但是在初始化混音器后,如果没有先调用 pygame.mixer.quit(),则无法更改播放参数 。

**pygame.mixer.pre_init(**预设混音器初始化参数

pre_init(frequency=22050, size=-16, channels=2, buffersize=4096) -> none

调用 pre_init 可以更改调用 真正的初始化 pygame.mixer.init() 使用的默认值。允许使用关键字参数。设置自定义混音器播放值的最佳方法是 在调用顶级 pygame.init() 之前调用 pygame.mixer.pre_init()。对于向后兼容性参数,零值将替换为启动默认值。

**pygame.mixer.quit()**退出混音器

quit() -> none

这将卸载 pygame.mixer,如果稍候重新初始化,则所有播放将停止并且任何加载的sound对象可能与混音器不兼容。

**pygame.mixer.get_init()**测试混音器是否初始化

get_init() -> (frequency, format, channels)

如果混合器已初始化,则返回正在使用的播放参数。如果混音器尚未初始化,则返回none

**pygame.mixer.stop()**停止播放所有声道

stop() -> none

这将停止所有活动混音器通道的播放。

**pygame.mixer.pause()**暂时停止播放所有声道

pause() -> none

这将暂时停止活动混音器通道上的所有播放。稍后可以 通过 pygame.mixer.unpause() 恢复播放

**pygame.mixer.unpause()**恢复播放声道

unpause() -> none

这将在暂停后恢复所有活动声道。

**pygame.mixer.fadeout()**停止前淡出所有声音的音量

fadeout(time) -> none

这将在设定时间上淡出所有活动通道上的音量,时间以毫秒为单位。声音静音后,播放将停止。

**pygame.mixer.set_num_channels()**设置播放频道的总数

set_num_channels(count) -> none

设置调音台的可用频道数。默认值为8。可以增加或减少该值。如果该值减小,则截断的通道上播放的声音将停止。

**pygame.mixer.get_num_channels()**获取播放频道的总数

get_num_channels() -> count

返回当前活动的播放通道数。

**pygame.mixer.set_reserved()**预留频道自动使用

set_reserved(count) -> none

调音台可以保留任意数量的通道,这些通道不会被声音自动选择播放。如果声音当前正在预留频道播放,则不会停止。

这允许应用程序为重要声音保留特定数量的声道,这些声音不得被丢弃或具有可保证的频道。

**pygame.mixer.find_channel()**找到一个未使用的频道

find_channel(force=false) -> channel

这将找到并返回一个非活动的channel对象。如果没有非活动通道,则此函数将返回none。如果没有非活动通道且force参数为true,则会找到运行时间最长的声道并返回它。

如果调音台有 pygame.mixer.set_reserved() 保留频道,则此处不会返回这些频道。

**pygame.mixer.get_busy()**测试mixer 是否正忙

get_busy() -> bool

如果混音器正忙,则返回true。如果混音器处于空闲状态,则返回false。

类 pygame.mixer.sound 从文件或缓冲区对象创建新的sound对象

sound(filename) -> sound sound(file=filename) -> sound sound(buffer) -> sound sound(buffer=buffer) -> sound sound(object) -> sound sound(file=object) -> sound sound(array=object) -> sound

  • pygame.mixer.sound.play        -        开始播放声音

  • pygame.mixer.sound.stop        -        停止声音播放

  • pygame.mixer.sound.fadeout        -        淡出后停止声音播放

  • pygame.mixer.sound.set_volume        -        设置此声音的播放音量

    • pygame.mixer.sound.get_volume        -        获取播放音量
  • pygame.mixer.sound.get_num_channels        -        计算此声音播放的次数

  • pygame.mixer.sound.get_length        -        得到声音的长度

  • pygame.mixer.sound.get_raw        -        返回sound样本的bytestring副本。从文件名,python文件对象或可读缓冲区对象加载新的声音缓冲区。将执行有限的重新采样以帮助样本匹配混音器的初始化参数。unicode字符串只能是文件路径名。python 2.x字符串或python 3.x字节对象可以是路径名或缓冲区对象。使用’file’或’buffer’关键字来避免歧义; 否则sound可能会猜错。如果使用了array关键字,则该对象应该导出版本3,c级别数组接口,或者对于python 2.6或更高版本,导出新的缓冲区接口(首先检查该对象的缓冲区接口。)

sound对象表示实际的声音样本数据。更改sound对象状态的方法将是sound播放的所有实例。sound对象还导出数组接口,对于python 2.6或更高版本,还会导出新的缓冲区接口。

可以从ogg音频文件或未压缩的 wav 文件加载声音。

注意:缓冲区将在内部复制,不会在它与sound对象之间共享数据。

目前缓冲区和数组支持与sndarray.make_sound 数值数组一致,因为忽略了样本符号和字节顺序。这将通过正确处理符号和字节顺序或在不同时引发异常来改变。此外,截断源样本以适合音频样本大小。这不会改变。

pygame.mixer.sound(buffer)是pygame 1.8中新增的pygame.mixer.sound关键字参数和数组接口支持pygame 1.9.2中的新功能。

**play()**开始播放声音

play(loops=0, maxtime=0, fade_ms=0) -> channel

在可用频道上开始播放声音(即,在计算机的扬声器上)。 这将强制选择一个频道,因此如有必要,播放可能会切断当前正在播放的声音。

loops参数控制第一次播放后样本重复的次数。值 5 表示声音将播放一次,然后重复播放五次,因此共播放六次。默认值(0)表示声音不重复,因此只播放一次。如果循环设置为-1,则sound将无限循环(但是您仍然可以调用stop()来停止它)。

maxtime参数可用于在给定的毫秒数后停止播放。

fade_ms参数将使声音以0音量开始播放,并在给定时间内逐渐升至全音量。样本可以在淡入完成之前结束。

这将返回所选通道的channel对象。

**stop()**停止声音播放

stop() -> none

这将停止在任何活动频道上播放此声音。

**fadeout()**淡出后停止声音播放

fadeout(time) -> none

这将在以毫秒为单位在时间参数上淡出后停止播放声音。sound会在所有播放的频道上消失并停止。

**set_volume()**设置此声音的播放音量

set_volume(value) -> none

这将设置此声音的播放音量(响度)。如果正在播放,这将立即影响声音。它也会影响此声音的任何未来播放。参数是从0.0到1.0的值。

**get_volume()**获取播放音量

get_volume() -> value

返回0.0到1.0之间的值,表示此sound的音量。

**get_num_channels()**计算此声音播放的次数

get_num_channels() -> count

返回此声音正在播放的活动频道数。

**get_length()**得到声音的长度

get_length() -> seconds

以秒为单位返回此声音的长度。

**get_raw()**返回sound样本的bytestring副本。

get_raw() -> bytes

将sound对象缓冲区的副本作为字节(对于python 3.x)或str(对于python 2.x)对象返回。

pygame 1.9.2中的新功能。

pygame.mixer.channel创建一个channel对象来控制播放

channel(id) -> channel

  • pygame.mixer.channel.play        -        在特定频道播放声音

  • pygame.mixer.channel.stop        -        停止在频道上播放

  • pygame.mixer.channel.pause        -        暂时停止播放频道

  • pygame.mixer.channel.unpause        -        恢复暂停播放频道

  • pygame.mixer.channel.fadeout        -        淡出通道后停止播放

  • pygame.mixer.channel.set_volume        -        设置播放频道的音量

  • pygame.mixer.channel.get_volume        -        获得播放频道的音量

  • pygame.mixer.channel.get_busy        -        检查通道是否处于活动状态

  • pygame.mixer.channel.get_sound        -        得到当前播放的声音

  • pygame.mixer.channel.queue        -        排队sound对象以跟随当前

  • pygame.mixer.channel.get_queue        -        返回排队的任何声音

  • pygame.mixer.channel.set_endevent        -        播放停止时让频道发送事件

  • pygame.mixer.channel.get_endevent        -        获取播放停止时频道发送的事件

返回其中一个当前通道的channel对象。id必须是从0到 值pygame.mixer.get_num_channels() 的值。

channel对象可用于精确控制sounds的播放。一个频道只能播放一个声音。使用频道完全是可选的,因为pygame默认可以管理它们。

**play()**在特定频道上播放声音

play(sound, loops=0, maxtime=0, fade_ms=0) -> none

这将开始播放特定频道上的声音。 如果频道正在播放任何其他声音,它将被停止。

loops参数与sound.play()中的含义相同:它是第一次重复声音的次数。 如果是3,声音将播放4次(第一次,然后是三次)。 如果循环为-1,则播放将无限重复。

与sound.play()一样,maxtime参数可用于在给定的毫秒数后停止播放声音。

与sound.play()一样,fade_ms参数可以在声音中淡入淡出。

**stop()**停止在频道上播放声音

stop() -> none

停止在频道上播放声音。播放停止后,频道可用于播放新的声音。

**pause()**暂时停止播放频道

pause() -> none

暂时停止在频道上播放声音。它可以在之后调用 channel.unpause() 恢复

**unpause()**恢复暂停播放频道

unpause() -> none

在暂停的频道上恢复播放。

**fadeout()**淡出通道后停止播放

fadeout(time) -> none

在给定时间参数上淡出声音后,以毫秒为单位停止播放通道。

**set_volume()**设置播放频道的音量

set_volume(value) -> none

set_volume(left, right) -> none

设定播放声音的音量(响度)。当频道开始播放时,其音量值将被重置。这只会影响当前的声音。value参数介于0.0和1.0之间。

如果传递一个参数,则它将是两个发言者的音量。如果传递两个参数并且混音器处于立体声模式,则第一个参数将是左扬声器的音量,第二个参数将是右扬声器的音量。(如果第二个参数为none,则第一个参数将是两个扬声器的音量。)

如果频道正在播放set_volume()已调用的声音,则会同时考虑这两个呼叫。例如:

sound = pygame.mixer.sound(“s.wav”) channel = s.play()      # sound plays at full volume by default sound.set_volume(0.9)   # now plays at 90% of full volume. sound.set_volume(0.6)   # now plays at 60% (previous value replaced). channel.set_volume(0.5) # now plays at 30% (0.6 * 0.5).

**get_volume()**获得播放频道的音量

get_volume() -> value

返回当前播放声音的通道音量。这没有考虑到使用的立体声分离 channel.set_volume()。sound对象也有自己的音量,与音频混合。

**get_busy()**检查通道是否处于活动状态

get_busy() -> bool

如果通道正在主动混合声音,则返回true。如果通道空闲,则返回false。

**get_sound()**得到当前播放的声音

get_sound() -> sound

返回当前在此频道上播放的实际sound对象。如果通道空闲,则返回none。

**queue()**排队sound对象以跟随当前

queue(sound) -> none

当声音在频道上排队时,它将在当前声音结束后立即开始播放。每个通道一次只能排队一个声音。排队的声音仅在当前播放自动结束时播放。在对channel.stop()或的任何其他呼叫中清除它 channel.play()。

如果在频道上没有主动播放声音,则声音将立即开始播放。

**get_queue()**返回排队的任何声音

get_queue() -> sound

如果声音已在此频道上排队,则会返回该声音。一旦排队的声音开始播放,它将不再在队列中。

**set_endevent()**播放停止时让频道发送事件

set_endevent() -> none

set_endevent(type) -> none

当为某个频道设置了一个尝试时,每当一个声音在该频道上播放时(不仅仅是第一次),它就会向一个游戏队列发送一个事件。使用pygame.event.get()一旦它发送到检索endevent。

请注意,如果您调用sound.play(n)或channel.play(sound,n),结束事件仅发送一次:声音播放“n + 1”次后(请参阅sound.play文档)。

如果在声音仍然播放时调用channel.stop()或channel.play()调用,则会立即发布事件。

type参数将是发送到队列的事件id。这可以是任何有效的事件类型,但一个好的选择是pygame.locals.userevent和之间的值 pygame.locals.numevents。如果没有给出类型参数,那么channel将停止发送事件。

如果你也是看准了python,想自学python,在这里为大家准备了丰厚的免费学习大礼包,带大家一起学习,给大家剖析python兼职、就业行情前景的这些事儿。

一、python所有方向的学习路线

python所有方向路线就是把python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其必先利其器。学习python常用的开发软件都在这里了,给大家节省了很多时间。

三、全套pdf电子书

书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

四、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

五、面试资料

我们学习python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

成为一个python程序员专家或许需要花费数年时间,但是打下坚实的基础只要几周就可以,如果你按照我提供的学习路线以及资料有意识地去实践,你就有很大可能成功!
最后祝你好运!!!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

一个人可以走的很快,但一群人才能走的更远!不论你是正从事it行业的老鸟或是对it行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com