持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第19天,点击查看活动详情
使用 pyGame
Pygame软件包包含许多可以独立使用的模块。您可能在游戏中使用的每个设备都有一个模块,还有许多其他设备可以使游戏创建变得轻而易举。请参阅表 3-1,了解所有 Pygame 模块。您访问这些
模块通过py游戏命名空间;例如,pygame。display 是指显示模块。
表 3-1.游戏包模块名称中的模块
*有关 Pygame 模块的完整文档,请参阅 pygame.org/docs/。
您将在每个游戏中使用的一些模块。您将始终拥有某种显示,因此di splay模块是必不可少的,并且您肯定需要某种输入,无论是键盘,操纵杆还是鼠标。其他模块不太常用,但它们组合在一起为您提供了最强大的游戏创建工具之一。并非表 3-1 中的所有模块都保证存在于每个平台上。运行游戏的硬件可能没有某些功能,或者未安装所需的驱动程序。如果是这种情况,Pygame会将模块设置为无,这样就很容易测试了。以下代码段检测是否为 py 游戏。字体模块可用,如果不是,则退出:
Hallo world Revisited
正如我在第1章中提到的,在学习新语言时有一个传统,即你编写的第一个代码在屏幕上显示文本“Hello, World!”从技术上讲,我们已经用打印的“Hello, World!”语句完成了此操作 - 但这有点令人失望,因为作为游戏程序员,我们有兴趣创建吸引人的视觉效果,而一行文本并不能削减它!我们将使用Pygame创建一个Hello World脚本,该脚本将在桌面上打开一个图形窗口,并在标准鼠标光标下绘制图像。运行时,您将看到一个类似于图 3-1 所示的窗口。
代码请参见清单 3-1。如果您愿意,请立即运行它;我们将在本章中逐步介绍它。
清单 3-1 需要两个图像:一个用作背景,另一个用作鼠标光标绘制。您可以从 Apress 网站的“源代码/下载”部分下载此示例和其他示例的文件。如果您目前无法访问互联网,则可以使用硬盘驱动器上的图像文件,或者使用任何图形或照片编辑软件进行制作。任何图像都可以用于背景,只要它的大小至少为640 x 480(任何更大且多余的图像将被剪切)。对于鼠标光标,您将需要一个较小的图像,该图像可以舒适地放在背景中。一个好的尺寸是80×80。继续第一章的河豚主题,官方
背景将是碗和筷子的图片,以及鼠标光标的非常原始的河豚图片。前两行设置图像的文件名;如果您使用不同的图像,则应将文件名替换为图像的位置。让我们将此脚本分解为一口大小的块。在脚本的顶部,我们导入运行示例时需要的外部模块,类,函数等:
一行导入pygame包,这使我们可以访问其所有包
子模块,如 皮博弈 。图像和皮游戏。声音。第二行导入一个进入顶级的函数和常量(不更改的值)的数量
命名空间。为了使用Pygame,这样做并不重要,但它很方便,因为我们不必在常用值之前加上pygame命名空间。最后一个 import 语句从 sys(标准库中的模块)导入单个函数。正如您可能已经猜到的那样,退出的目的是立即完成脚本。调用它会导致Pygame窗口消失,蟒蛇关闭。当用户单击关闭按钮时,脚本调用 exit;否则,用户将无法关闭窗口!
提示 如果您遇到无法关闭 Pygame 窗口的情况,则可以通过按 Ctrl+C 来停止 Python 的轨迹。
这行相当简单的Python代码实际上做了很多工作:
它初始化pygame包中的每个子模块,这些子模块可以加载驱动程序和查询硬件,以便Pygame准备好使用计算机上的所有设备。您可以通过在每个子模块中单独调用 init 函数来仅初始化要使用的模块;例如,将初始化声音模块。这可以使脚本启动得更快一些,因为只有您实际使用的模块才会被初始化。对于游戏,您将需要大多数(如果不是全部)模块 - 因此我们将坚持使用这个包罗万象的初始化函数。在我们调用它之后,我们拥有Pygame的全部力量!
初始化Pygame后,我们需要创建一个显示表面:
显示器可以是桌面上的窗口,也可以是整个屏幕,但您始终通过 Pygame Surface 对象访问它。在我们的脚本中对pygame.display.set_mode的调用将返回表示桌面上的窗口的 Surface 对象。它需要三个参数;只需要第一个,它应该是一个元组,其中包含我们要创建的显示器的宽度和高度。我们的窗口将是640 x 480像素,这足够大,因此我们可以看到正在发生的事情,但不会太大以至于它遮挡了太多的桌面。我们提供给set_mode的下一个参数是包含显示创建中使用的标志的值。标志是可以打开或关闭的功能;您可以将多个标志与按位 OR 运算符 () 组合在一起。例如,若要创建双缓冲硬件图面,请将标志参数设置为 DOUBLEBUF|地平线。有关您可以使用的标志,请参见表 3-2。我将在本章后面的“打开显示器”一节中更详细地介绍它们。我们不会为第一个 Pygame 脚本启用任何这些标志,因此我们为标志提供的值仅为 0,这也是默认值。
一个参数指定显示图面的深度,即用于在显示中存储颜色的位数。位或二进制数字是计算机中最基本的存储单元。位正好有两个电位值,1 或 0,并且在内存中以 8 为组排列。一组 8 位称为字节。不要担心这听起来像是技术喋喋不休;Python倾向于向程序员隐藏这种东西。我们将使用值 32 作为位深度,因为它为我们提供了最多的颜色;有关其他潜在的位深度值,请参见表 3- 3。如果您不提供深度值或将其设置为 0,Pygame 将使用桌面的深度。
注意 有时Pygame无法向我们提供我们要求的确切显示。可能是图形卡不支持我们请求的功能。幸运的是,Pygame将选择与硬件兼容的显示器,并模拟我们实际要求的显示器。谢谢你,皮加梅!
如果一切顺利,对set_mode的调用将在桌面上显示一个 Pygame 窗口,并返回一个 Surface 对象,该对象随后存储在变量屏幕中。我们对新创建的曲面做的第一件事就是在显示屏中调用set_caption
模块来设置 Pygame 窗口的标题栏。我们将标题设置为“你好,世界!-只是为了使它成为一个有效的你好世界脚本!
接下来,我们使用pygame.image中的加载函数来加载背景和鼠标光标的两个图像。我们传入存储在脚本开头的图像的文件名:
加载函数从硬盘驱动器读取文件并返回包含图像数据的图面。这些对象类型与我们的显示器相同,但它们表示存储在内存中的图像,并且在我们将它们绘制到主显示器之前不可见。第一次打电话到皮游戏。图像。1oad 在背景图像中读取,然后立即调用转换,这是 Surface 对象的成员函数。此功能
将图像转换为与显示器相同的格式,因为如果显示器具有相同的深度,则绘制图像的速度更快。鼠标光标以类似的方式加载,但我们调用convert_alpha而不是转换。这是因为我们的鼠标光标图像包含 alpha 信息,这意味着图像的某些部分可能是半透明的或完全不可见的。在我们的鼠标图像中没有alpha信息,我们被限制在一个难看的正方形或矩形作为我们的鼠标光标!下一章将更详细地介绍 Alpha 和图像格式。
脚本中的下一行直接跳入主游戏循环:
while True
这个 while 循环以 True 为条件,这意味着它将不断循环,直到我们脱离它,或者以某种其他方式强制它退出。所有游戏都将有一个类似于此的循环,通常每次屏幕刷新重复一次。
在主游戏循环中,我们有另一个循环 - 事件循环,大多数游戏也将以一种或另一种形式出现:
事件是Pygame如何通知您代码之外发生了某些事情。事件是为许多事情创建的,从按键到从 Internet 接收信息,并在您处理它们之前为您排队。该函数在
pygame.event 模块返回任何等待我们的事件,然后我们在 for 循环中循环这些事件。对于此脚本,我们只对 QUIT 事件感兴趣,该事件由 Pygame 在用户单击 Pygame 窗口中的关闭按钮时生成。因此,如果事件类型为 QUIT,我们调用 exit 关闭,所有其他事件都将被忽略。当然,在游戏中,我们必须处理更多的事件。重要的是要调用pygame.quit()和退出()才能完全关闭Pygame。趁寇() 取消初始化蚜棋。
下一行将背景图像分流到屏幕上(bliting 意味着从一个图像复制到另一个图像):
此行使用屏幕 Surface 对象的 blit 成员函数,该函数采用源图像(在本例中为 640 x 480 背景)和包含目标位置的元组。背景从不移动;我们只是希望它覆盖整个Pygame窗口,所以我们切换到坐标(0,0),这是屏幕的左上角。提示 请务必注意屏幕的每个部分。如果不这样做,则在对事物进行动画处理时可能会出现奇怪的视觉效果,并且您的游戏在每台运行它的计算机上看起来可能会有所不同。尝试注释掉对屏幕.blit的调用,看看会发生什么。
绘制背景后,我们要在通常的鼠标指针下方绘制mouse_cursor:
获取鼠标的位置很好,很简单;皮游戏。鼠标模块包含我们使用鼠标所需的所有内容,包括get_pos,它返回一个包含鼠标坐标的元组。为方便起见,第一行将此元组解压缩为两个值:x 和 y。当我们张开鼠标光标时,我们可以使用这两个值作为坐标,但这会将图像的左上角放在鼠标下方,并且我们希望图像的中心位于鼠标下方。因此,我们做了一些数学运算(不要害怕!),以调整x和y,以便鼠标图像向上移动一半的高度,向左移动一半宽度。使用这些坐标将图像的中心放在鼠标指针的正下方,这样看起来会更好。至少对于鱼的图像是这样 - 如果你想使用更典型的指针图像,调整坐标,使尖端位于真正的鼠标坐标下方。
对鼠标图像进行印迹的方式与对背景进行印迹处理的方式相同,但是我们使用计算的坐标而不是 (0, 0)。这足以创造我们正在寻找的效果,但是在我们可以看到任何东西之前,我们还需要做一件事:
当您通过光圈构建图像到屏幕表面时,您不会立即看到它们。这是因为Pygame首先将图像构建到后台缓冲区,这是一个
在显示之前,内存中不可见显示。如果我们没有此步骤,用户将看到单个 blits 发生,这将最不愉快地闪烁。对于游戏程序员来说,闪烁是敌人!我们希望看到丝般光滑,令人信服的动画。幸运的是,给皮加米的电话。di splay.update ()是我们在内存中创建的图像显示给用户而不会闪烁所需的全部内容。
运行此脚本时,应看到如图 3-1 所示的内容。如果您使用的是“官方”图像,那么一条看起来很奇怪的鱼会尽职尽责地跟随鼠标光标。