Python Pygame Introduction 译文

by Pete Shinners

pete@shinners.org

原文: http://www.pygame.org/docs/tut/intro/intro.html

译者: Black Glory

注释: 看E文太蛋疼,应该没有版权问题吧,那么由我翻译,如果存在版权问题请联系我,我会及时将此文章撤除,渣翻译请谅解,以下的内容是正文

这篇文章是Python编程中的Pygame库的介绍. 原版本发布在Py Zine的第一卷第三期上. 这个版本进行了细微的修改, 以创建一篇更好的文章. Pygame是一个封装了SDL库及其工具的Python扩展库.

历史

Pygame诞生于2000年的夏天, 作为一个从事C语言多年的程序员, 我发现可以同时使用Python和SDL. 如果你已经掌握了Python, 并使用1.5.2版本. 你可能需要一个SDL的介绍, SDL是指Simple Directmedia Library. 由Sam Lantinga创建, SDL是一个用于控制多媒体的跨平台C库, 并且可以与DirectX相比. 它已经被用以上百个商业广告和开源游戏项目. 在我明白混合Python和SDL是一个很有趣的提议前,我做过不长时间的清除简单的项目.

TASTE

我觉得最好的学习一个新库的方式是直接进入一个例子, 在Pygame的初期, 我创建了一个只有7行代码的弹球动画. 让我们在一个友好的版本中看看做同样的事. 这应该是一个简单到足够跟得上,且完整的分类, 代码如下:

1    import sys, pygame
2    pygame.init()
3
4    size = width, height = 320, 240
5    speed = [2, 2]
6    black = 0, 0, 0
7
8    screen = pygame.display.setmode(size)
9
10    ball = pygame.image.load(“ball.bmp”)
11    ballrect = ball.get
rect()
12
13    while 1:
14        for event in pygame.event.get():
15            if event.type == pygame.QUIT: sys.exit()
16
17        ballrect = ballrect.move(speed)
18        if ballrect.left < 0 or ballrect.right > width:
19            speed[0] = -speed[0]
20        if ballrect.top < 0 or ballrect.bottom > height:
21            speed[1] = -speed[1]
22
23        screen.fill(black)
24        screen.blit(ball, ballrect)
25        pygame.display.flip()

ball.bmp:

就是这么简单, 你可以得到一个弹球动画. 首先我们看到的导入和初始化是不必在意的. “import pygame”导入所有可见的Pygame模块包, 调用”pygame.init()”初始化每个模块.

在第8行, 我们使用”pygame.display.setmode()”创建一个图形窗口. Pygame与SDL使这简单的创了一个基于图形硬件的最佳的图形模式. 你可以无视模式和SDL将会补偿的任何硬件无法做到的事. Pygame将描绘图像作为一个*表面对象(Surface object).* “display.setmode()”函数创建了一个新的表面对象来表示实时显示的图形. 你的任何绘图动作都会在表面以可见的形式显示在显示器上.

在第10行,我们载入了弹球的图像, Pygame通过SDL_image库支持了各种各样的图像格式, 包括JPG, PNG, TGA, GIF. “pygame.image.load()”函数返回给我们一个包含弹球数据的表面. 这个表面将会保持从文件中得到的colorkey或alpha透明度. 在加载这个弹球图像之后, 我们创建一个名为ballrect的变量. Pygame开始方便的创建一个名为Rect的实例对象类型, 它代表一个矩形区域. 之后,在代码部分我们可以看到Rect对象会做些什么.

在这一点上, 第13行, 我们的程序已经初始化并准备好去运行. 在一个死循环中检测用户的输入, 移动这个弹球, 并绘制弹球. 如果你学习过GUI编程, 会有对事件和事件循环的经验. 在Pygame中这并没有多大区别, 我们检查QUIT事件是否发生. 如果发生, 我们就关闭程序, 并清除所有内容.

这时我们要更新球的位置. 在第17至21行按目前的速度移动ballrect变量. 如果这弹球移动超出屏幕, 我们就改变移动方向. 虽然不是牛顿的物理学, 但我们需要这么做.

在第23行, 我们擦除并在屏幕上填充黑色的RGB值. 如果你从未从事过动画制作会感到这很奇怪. 你也许会问”为什么要擦除它们? 为什么不是只在屏幕上移动弹球?” 电脑动画作品并不只是这样工作. 动画无非不是一张张的图片, 用愚弄人的手段连续显示做到很棒的效果. 屏幕只是一个个静态的图像, 这才是用户看到的. 如果我们不擦出旧的弹球, 就会形成一系列连贯的动作印在屏幕上, 因为我们在不断的复制并移动球.

在第24行, 我们在屏幕上绘制弹球图像. 影像的处理通过”Surface.blit()”方法完成. 主要是指将一个图像的颜色复制到另一个位置. 我们通过blit方法从一个源来复制, 并将其在新的位置显示.

最后我们需要实现的是实时更新显示. Pygame管理具有双缓冲显示. 当我们完成”pygame.display.flip()”方法的绘制后. 这一切使我们在屏幕上的表面变得可见. 这种缓冲可以确保我们只看到屏幕上完全绘制的帧. 没有它, 我们看到的绘制和擦除是不连续的, 因为它们还未创造完毕.

以上是对Pygame的简短介绍. Pygame的模块中也可以处理输入,比如键盘, 鼠标 , 游戏杆. 它可以混合音频和流媒体的音乐解码. 表面可以画出简单形状, 缩放, 旋转, 图片. 甚至实时在Python中操纵数字图像的像素阵列. 它有MPEG视频播放,音频CD的支持. Pygame中也有能力作为一个跨平台的PyOpenGL显示层. Pygame的模块的大部分是用C写的,很少有真正使用Python来做的.

Pygame的网站有每个Pygame的功能和范围所面向用户的完整的参考文件及教程. Pygame的源码中有很多像猴子猛击和UFO射击的例子.

PYTHON与游戏

“游戏适合Python吗?” 答案是, “这取决于游戏.”

Python在运行游戏的时候显得很能干. 它甚至可能会使你惊讶在低于30毫秒运行时. 然而, 这并不是难以达到的上限, 一旦你的游戏开始变得复杂, 在实时进行游戏的时候会对计算机进行完全的应用.

在过去几年中一直是游戏发展,迈向更高层次的语言去移动的有趣趋势. 通常一个游戏分为两大部分, 游戏引擎,它必须以最快的速度,和游戏逻辑运行, 这使得实际引擎确实做了一些事. 这是不久前用汇编语言编写的游戏引擎, 和现在用C编写的游戏引擎. 现在, 用C编写游戏引擎, 游戏本身则是使用脚本语言来编写高级代码. 像Quake3和Unreal都使用字节码运行它们的脚本.

早在2001年, 开发者Rebel Act Studios完成了他们的游戏, 例如: Blade of Darkness. 使用他们自己定制的3D引擎, 游戏是用Python语言来编写的. 这是一个血腥的第三人称战斗游戏. 您可以操作出复杂的组合攻击, 在探索地牢和城堡斩首中世纪武士. 你可以下载这个游戏的第三方插件,并发现他们不过是些Python源文件罢了.

最近, Python已经被像Freedom Force, Humungous’ Backyard Sports Series 这样的游戏品种使用.

Pygame和SDL作为一个良好的C语言编写的2D游戏引擎. 游戏依然会发现它们运行时绝大部分都是用SDL内部处理的图形. SDL可以利用图形硬件加速的优势. 启用它可以运行大约40~200帧每秒的游戏. 当你看到你的Python比赛中每秒200帧的游戏运行, 你就会知道Python能和游戏一起工作了.

Python和SDL在多个平台上一起工作是令人印象深刻的. 例如, 在2001年5月我发布了我自己全部的Pygame项目, SolarWolf, 一个街机风格动作游戏. 有一件事情令我吃惊的是, 一年后一直没有任何补丁, 修正或更新的需求. 这个游戏完全是在Windows系统上开发的, 没有做任何额外的工作, 结果却可以在Linux, Mac OSX上运行, 在许多的Unix系统上特别有效的工作.

尽管如此, 还是有非常明显的局限性. 来管理硬件加速图形的最好方式并不是从软件渲染中得到速度最快的结果. 硬件支持并不适用于所有的平台. 当游戏变得更加复杂时, 往往必须只能在一方工作. SDL有一些设计上的局限性, 比如全屏滚动图形可以快速的让你的游戏无法播放. 虽然SDL不适合所有类型的游戏, 但是记住, 像Loki公司已经使用SDL的运行质量运用在各种繁多的零售软件上.

当谈到编写游戏, Pygame的辩证互动水平低. 很快你就会发现自己需要包装游戏环境中的常见功能. 关于这里有Pygame伟大的事情是没什么可让你做的. 你的程序完全的控制一切. 这个副作用会使你发现自己借用大量的代码与获得更先进的框架放在一起. 你正在对你需要一个什么样的游戏框架做更深入的了解.

 

CLOSING

游戏开发是非常有益处的, 代码编写出的东西能够让你看到并与其交互这会让你感到兴奋. Pygame目前有近30个使用它的项目. 其中几个是准备去玩. 您可能会带着惊讶参观Pygame的网站, 看看其他用户是否已经能和Python做到.

首次来尝试用Python开发游戏的人数引起了我的注意. 我明白游戏为什么会进行新的绘制, 它也可以是困难的, 因为游戏制作需要一个坚实的理解的语言. 我试着写了支持这些概念的人很多新的例子和Pygame的教程.

最后, 我的建议是保持简单. 我不能强调这一点, 如果你正计划着创建第一个游戏, 有很多的东西需要学习. 即使是一个简单的游戏也将挑战你的设计, 复杂的游戏并不意味着很有趣. 当你了解Python时, 你可以用Pygame花上一两个星期制作一个简单的游戏. 在那时, 你将需要一段时间进行数量竟然修改, 使之成为一个完整像样的游戏.