这是我们的教程系列“使用 Pygame 进行游戏开发”的第 3 部分。需要声明的是,虽然这系列教程是针对少儿编程的,但不是很适合学生阅读学习,它更适合作为老师阅读消化之后,重新改进成适合小朋友学习的内容。
转向图形精灵
彩色矩形很好,就像我们上一篇文章中所采用的一样 —— 它们是一个很好的开始方式,可以确保我们的游戏基本工作正常,但我们迟早会想要为游戏的精灵使用一个很酷的宇宙飞船图像或角色。 这将我们引向第一个问题:我们该从哪里获得游戏图片素材?
哪里可以找到图片
当您的游戏需要图片素材时,我们通常有 3 个选择:
- 自己画
- 找一个艺术家为你画
- 使用互联网上已有的艺术作品
如果我们自己或者我们的的朋友有艺术天赋,则选择 1 和 2 是个不错的选择,但对于大多数程序员来说,创造漂亮的图片并不在我们的技能范围内。 所以这离不开互联网,但我们要记住不应该使用无权使用的图片,这是非常重要的。 虽然搜索和找到马里奥或您最喜欢的口袋妖怪的图片很容易,但这并不意味着您可以在游戏中使用它,特别是如果您打算将其放到网上并让其他人看到。
幸运的是,有一个很好的网站:OpenGameArt.org。 这个网站上载有大量的图片、声音、音乐等 - 所有这些都得到了艺术家的慷慨许可,供我们在游戏中使用。 我们可以在这里找到我们所需要的素材,比如有个叫Kenny的艺术家提供的素材(只需将他的名字放在搜索框中)。
也可以访问直接访问 Kenney 的网站。
我喜欢使用 Kenney 的艺术作品的原因(除了它的质量非常高)是他喜欢打包发行。 这意味着我们可以获得风格都匹配的艺术作品集,而不是尝试混合和匹配来自多个艺术家的图像。
在本课中,我们将使用 Kenney 的 Platformer Art Complete Pack,其中包含用于制作平台风格游戏的大量图形。 继续下载并解压缩。 我们将使用图像“p1_jump.png”:
您也可以单击上面的图像下载Player图像。
组织你的游戏素材
首先,我们需要一个文件夹来保存我们的素材,这是游戏开发人员用来指代图片和音频等事物的术语。 我把这个文件夹简称为“img”,我把Player图片放进去。
要在我们的游戏中使用这张图片,我们需要告诉 Pygame 加载图片文件,这意味着我们需要我们的程序知道文件的位置。 根据您使用的计算机类型,这可能会有所不同,并且我们希望能够在任何计算机上运行我们的程序,因此我们需要加载一个名为 os 的 Python 库,然后指定我们的游戏所在的位置:
注:在好学好教Python平台上,Python文件和素材均放在同一个目录下。但在实际开发中,应该将素材和Python代码进行一定的分类。
import pygame
import random
import os
# set up asset folders
game_folder = os.path.dirname(__file__)
特殊的 Python 变量 file 指向保存游戏代码的任何文件夹,命令 os.path.dirname 将得到该文件夹的路径。 例如,在我的计算机上,我的代码的路径是这样的:/Users/chris/Documents/gamedev/tutorials/1-3 sprite example.py
我使用的是运行 OS X 的计算机。如果您使用的是 Windows,您的路径可能如下所示:C:\Users\chris\Documents\python\game.py
如你所见,不同的操作系统使用不同的方式来描述文件/文件夹在计算机上的位置。 通过使用 os.path 命令,我们可以让计算机找出正确的路径是什么(例如是使用“/”还是“\”。)
现在,我们可以指定我们的“img”文件夹:
import pygame
import random
import os
# set up asset folders
game_folder = os.path.dirname(__file__)
img_folder = os.path.join(game_folder, 'img')
player_img = pygame.image.load(os.path.join(img_folder, 'p1_jump.png')).convert()
现在我们已经使用 pygame.image.load() 加载了我们的图像,并且确保使用了 convert(),这将通过将图像转换为可以更快地在屏幕上绘制的格式来加速 Pygame 的绘制。现在我们准备用我们美观的Player图像替换精灵中的纯绿色方块:
class Player(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = player_img
self.rect = self.image.get_rect()
self.rect.center = (WIDTH / 2, HEIGHT / 2)
请注意,我们删除了 self.image.fill(GREEN) 命令 —— 我们不再需要用纯色填充它。 get_rect() 仍然可以正常工作,因为它会查看 self.image 来确定边界矩形应该是什么。
现在,如果您运行该程序,您应该会看到一个漂亮的小卡通外星人在屏幕上运行。 但是我们有一个问题——我们看不到,因为背景目前是黑色的。 将底部的 screen.fill() 命令更改为其他命令 - 我决定使用 BLUE。 现在您可以看到:
对于保存在计算机中的图片文件,它始终是一个矩形像素网格。 无论您绘制什么形状,仍然有一个像素边界填充图像的“背景”。 我们需要做的是告诉 Pygame 忽略图像中我们不关心的像素。 在这张图片中,这些像素恰好是黑色的,所以我们可以添加以下内容:
class Player(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = player_img
self.image.set_colorkey(BLACK)
self.rect = self.image.get_rect()
self.rect.center = (WIDTH / 2, HEIGHT / 2)
set_colorkey() 只是告诉 Pygame,当我们绘制图像时,我们要忽略指定颜色的任何像素。 现在我们的图片看起来好多了:
恭喜,您现在已经了解了使用 Pygame 的基础知识! 现在是时候开始制作真正的游戏了。 我们创建了一些教程,展示了从头到尾创建完整游戏的过程。 随着教程内容的深入,它们会变得更加复杂,因此建议您按顺序学习它们。
本文完整源代码可以点击访问。