Python 金字塔游戏攻略

作者

皮特·辛纳斯

联系方式

pete@shinners.org

本文是对 pygame libraryPython programmers 。最初的版本出现在 Py Zine ,第一卷,第三期。这个版本包含了一些小的修改,以创建一个全面的更好的文章。PYGAME是一个包装了 SDL 类库及其帮助者。

HISTORY

PYGAME开始于2000年夏天。作为一名多年的C程序员,我几乎同时发现了Python和SDL。您已经熟悉了版本为1.5.2的Python。您可能需要介绍SDL,它是简单的DIRECTMEDIA层。由Sam Lantinga创建的SDL是用于控制多媒体的跨平台C库,可与DirectX相媲美。它已经被数百款商业和开源游戏所使用。这两个项目的简洁和直截了当给我留下了深刻的印象,不久我就意识到混合使用Python和SDL是一个有趣的建议。

我发现了一个已经在进行中的小项目,它的想法完全相同,就是PySDL。由Mark Baker创建的PySDL是作为Python扩展的SDL的直接实现。这个界面比普通的SWIG包装更干净,但我觉得它强制了一种“C风格”的代码。PySDL的突然死亡促使我承担了自己的一个新项目。

我想做一个真正利用了Python的项目。我的目标是让简单的事情变得容易,让困难的事情变得简单。PYGAME成立于2000年10月。六个月后,pyGame 1.0版发布。

TASTE

我发现理解一个新的库的最好方法是直接跳到一个例子中。在pyGame的早期,我用7行代码创建了一个弹跳球动画。让我们来看看同样的事情的一个更友好的版本。这应该足够简单,然后就会有一个完整的分解。

../_images/intro_ball.gif
 1import sys, pygame
 2pygame.init()
 3
 4size = width, height = 320, 240
 5speed = [2, 2]
 6black = 0, 0, 0
 7
 8screen = pygame.display.set_mode(size)
 9
10ball = pygame.image.load("intro_ball.gif")
11ballrect = ball.get_rect()
12
13while True:
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()

这是弹跳动画所能获得的最简单的效果。首先,我们看到导入和初始化pyGame并不值得一提。这个 import pygame 导入包含所有可用pyGame模块的包。呼唤 pygame.init() 初始化这些模块中的每个模块。

在……上面 line 8 我们创建一个图形窗口,调用 pygame.display.set_mode() 。通过默认使用图形硬件的最佳图形模式,PyGame和SDL可以轻松实现这一点。您可以覆盖该模式,并且SDL将补偿硬件不能执行的任何操作。PYGAME将图像表示为 表面 物体。这个 display.set_mode() 函数创建一个新的 表面 对象,它表示实际显示的图形。您对此曲面所做的任何绘制都将在监视器上可见。

在… line 10 我们加载我们的球图像。PyGame通过SDL_Image库支持各种图像格式,包括BMP、JPG、PNG、TGA和GIF。这个 pygame.image.load() 函数返回一个包含球数据的Surface。曲面将保留文件中的任何Colorkey或Alpha透明度。在加载了球图像之后,我们创建了一个名为balrect的变量。PyGame附带了一个方便的实用程序对象类型,名为 Rect ,它表示一个矩形区域。稍后,在代码的动画部分中,我们将看到 Rect 物件可以做到。

在这点上, line 13 ,我们的程序已初始化并准备运行。在无限循环中,我们检查用户输入,移动球,然后绘制球。如果您熟悉图形用户界面编程,您就有过事件和事件循环的经验。在PYGAME中,这没有什么不同,我们检查 QUIT 事件已经发生。如果是这样,我们只需退出程序,pyGame将确保所有东西都被干净地关闭。

是时候更新我们的控球位置了。 Lines 17 按当前速度移动Ballrect变量。 Lines 18 thru 21 如果球已经移动到屏幕外,则反转速度。不完全是牛顿物理学,但这就是我们所需要的。

在……上面 line 23 我们通过用黑色RGB颜色填充屏幕来擦除屏幕。如果你从未接触过动画,这可能看起来很奇怪。你可能会问“为什么我们需要擦除任何东西,为什么我们不直接移动屏幕上的球?”这并不完全是电脑动画的工作方式。动画只不过是一系列单一的图像,当按顺序显示时,它们在愚弄人眼看到运动方面做得非常好。屏幕只是用户看到的单一图像。如果我们没有花时间将球从屏幕上抹去,当我们不断地将球画在新的位置上时,我们实际上会看到球的“痕迹”。

在……上面 line 24 我们将球图像绘制到屏幕上。图像的绘制由 Surface.blit() 方法。Bit基本上意味着将像素颜色从一个图像复制到另一个图像。我们将Blit方法传递给一个源代码 Surface 要复制的源,以及要将源放置到目标上的位置。

我们需要做的最后一件事是实际更新可见显示。PYGAME使用双缓冲区来管理显示。当我们完成绘制时,我们将 pygame.display.flip()Update the full display Surface to the screen 方法。这使我们在Screen Surface上绘制的所有内容都可见。这种缓冲确保我们只能在屏幕上看到完全绘制的框架。如果没有它,用户将在创建屏幕时看到完成了一半的部分。

这就是对pyGame的简短介绍。还有一些模块可以用来处理键盘、鼠标和操纵杆等输入操作。它可以混合音频和解码流媒体音乐。与 曲面 您可以绘制简单的形状,旋转和缩放图片,甚至可以实时操作图像的像素作为数字数组。PYGAME还可以作为PYOpenGL的跨平台显示层。大多数的pyGame模块都是用C语言编写的,很少是真正用Python编写的。

PyGame网站上有完整的关于每个pyGame功能的参考文档和适用于所有用户的教程。这个山寨游戏的源代码中有很多关于猴子出拳和UFO射击的例子。

Python 和游戏

“Python适合玩游戏吗?”答案是:“这取决于比赛。”

事实上,Python在运行游戏方面相当有能力。在不到30毫秒的时间里,你很可能会惊讶于它的可能性有多大。不过,一旦你的游戏开始变得更加复杂,达到天花板并不难。任何实时运行的游戏都将充分利用计算机。

../_images/intro_blade.jpg

在过去的几年里,游戏开发出现了一个有趣的趋势,即转向更高级的语言。通常,一场比赛分为两个主要部分。游戏引擎,它必须尽可能快,以及游戏逻辑,它使引擎真正做一些事情。不久前,游戏的引擎是用汇编语言编写的,部分是用C编写的。如今,C已经转移到了游戏引擎,而游戏本身通常是用更高级的脚本语言编写的。像Quake3和虚幻这样的游戏以可移植字节码的形式运行这些脚本。

2001年初,开发商Rebel Act Studios完成了他们的游戏《Severance:Blade of Darkness》。使用他们自己的定制3D引擎,游戏的其余部分都是用Python编写的。这款游戏是一款血腥的动作第三人称透视战斗机。你控制中世纪的战士在探索地牢和城堡的同时进行复杂的斩首组合攻击。你可以下载这款游戏的第三方插件,然后发现它们只不过是Python源文件。

最近,Python被用于各种游戏,如自由原力和Humungous的后院体育系列赛。

../_images/intro_freedom.jpg

PYGAME和SDL是2D游戏的优秀C引擎。游戏仍然会发现,它们运行时的大部分时间都花在了SDL内部处理图形上。SDL可以利用图形硬件加速。启用这一功能可以将游戏的运行速度从每秒40帧左右更改为每秒200帧以上。当您看到您的Python游戏以每秒200帧的速度运行时,您会意识到Python和游戏可以协同工作。

令人印象深刻的是,Python和SDL在多个平台上都能很好地工作。例如,在2001年5月,我发布了我自己的完整电子游戏项目SolarWolf,这是一款街机风格的动作游戏。令我惊讶的一件事是,一年后,不再需要任何补丁、错误修复或更新。这款游戏完全是在Windows上开发的,但可以在Linux、Mac OSX和许多Unix上运行,而我这一端没有任何额外的工作。

尽管如此,还是有非常明显的局限性。管理硬件加速图形的最佳方法并不总是从软件渲染中获得最快结果的方法。并非所有平台都提供硬件支持。当游戏变得更复杂时,它通常必须致力于其中之一。SDL还有其他一些设计限制,像全屏滚动图形这样的东西可以迅速将你的游戏降到无法玩的速度。虽然SDL并不适合所有类型的游戏,但请记住,像Loki这样的公司已经使用SDL来运行各种零售质量的游戏。

当涉及到编写游戏时,PYGAME相当低级。您很快就会发现自己需要将常见的功能包装到您自己的游戏环境中。这款游戏最棒的地方在于,它的内部没有任何东西可以挡住你的路。你的程序完全控制着一切。这样做的副作用是,您会发现自己借了很多代码来组装一个更高级的框架。你需要更好地了解自己在做什么。

CLOSING

开发游戏是非常值得的,能够看到您编写的代码并与之交互是一件令人兴奋的事情。目前,有近30个其他项目在使用它。他们中的几个现在已经准备好上场了。您可能会惊讶地访问pyGame网站,并看到其他用户已经能够使用Python做了什么。

有一件事引起了我的注意,那就是许多人第一次来到Python尝试游戏开发。我可以理解为什么游戏对新程序员很有吸引力,但这可能很困难,因为创建游戏需要对语言有更扎实的理解。为了支持这群用户,我为刚接触这些概念的人写了很多例子和电子游戏教程。

最后,我的建议是保持简单。这一点我怎么强调都不为过。如果你计划创造你的第一个游戏,有很多东西需要学习。即使是一个简单的游戏也会挑战你的设计,而复杂的游戏并不一定意味着有趣的游戏。当您了解了Python之后,您就可以在一两周内使用pyGame创建一个简单的游戏。从那时起,你将需要惊人的时间来添加抛光,使之成为一场完全体面的比赛。

PyGame模块概述

cdrom

回放

cursors

加载游标图像,包括标准游标

display

控制显示窗口或屏幕

draw

在曲面上绘制简单的形状

event

管理事件和事件队列

font

创建和呈现TrueType字体

image

保存和加载图像

joystick

管理操纵杆设备

key

管理键盘

mouse

管理鼠标

sndarray

麻木地操控声音

surfarray

用麻木的方式处理图像

time

控制正时

transform

缩放、旋转和翻转图像




Edit on GitHub