Python Pygame 简介
Author: Pete Shinners(pete@shinners.org)
翻译: 杨晓宏(561071777@qq.com)
这篇文章为python编程者提供了一个对pygame的一个介绍。pygame是建立的在SDL(Simple DirectMedia Layer)库基础上的一个扩展库 。
历史
Pygame出现于2000年夏天。作为一名多年的C程序员,我在大约同一时间发现了Python和SDL。您已经熟悉Python,您可能需要对SDL进行介绍,它是Simple_DirectMedia_Layer的缩写。SDL由SamLantinga创建,是一个用于控制多媒体的跨平台C库,可与DirectX相媲美。它已经被用于数百个商业和开源游戏。将Python和SDL整合在一起,于是有了pygame的诞生。
Pygame是在2000年10月开始的开发,在6个月后,pygame 1.0版本发布。
任务
理解一个新库的最好方法就是直接看一个例子。
在pygame的早期,我用7行代码创建了一个跳跃的球动画。让我们来看看同样的东西。这是一个更友好的版本。
这应该足够简单,可以跟随我的解释,完全理解它们。
import sys, pygame
pygame.init()
size = width, height = 320, 240
speed = [2, 2]
black = 0, 0, 0
screen = pygame.display.set_mode(size)
ball = pygame.image.load("intro_ball.gif")
ballrect = ball.get_rect()
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT: sys.exit()
ballrect = ballrect.move(speed)
if ballrect.left < 0 or ballrect.right > width:
speed[0] = -speed[0]
if ballrect.top < 0 or ballrect.bottom > height:
speed[1] = -speed[1]
screen.fill(black)
screen.blit(ball, ballrect)
pygame.display.flip()
这是一个弹跳球的动画。
The import pygame 导入了包含所有游戏模块的包,然后调用了pygame.init() 初始化所有这些模块 。
在第8行,创建了一个图形窗口,其中调用pygame.display.set mode()。
Pygame和SDL通过默最佳图形模式来实现这一点。你可以重写这个模式,SDL将协调硬件能力。
Pygame表示图像为表面对象。set_mode()函数创建一个新的Surface对象,它代表实际显示的图形。你对这个表面做的任何改变都会在显示器上看到。
在第10行,我们加载我们的球图像。
Pygame通过sdlimage库支持多种图像格式,包括BMP、JPG、PNG、TGA和GIF。py.image.load()函数返回一个带有球图像数据的表面。
这个表面将保留任何颜色键或alpha透明度。加载完球图像后,我们创建了一个名为ballrect的变量。Pygame附带了一个实用对象类型,名为Rect,它代表一个矩形区域。稍后,在代码的动画部分中,我们将看到Rect对象可以做什么。
在第13行,我们的程序被初始化并准备运行。
在一个无限循环中,我们检查用户输入,移动球,然后画出球。如果您熟悉GUI编程,那么您就有过事件和事件循环的经验。
在pygame中,这没有区别。我们检查是否发生了退出事件。如果我们只是退出程序,pygame将确保清理一切后关闭。
现在是时候更新我们的球位置了。第17到21行按当前速度移动矩形变量。如果球移到屏幕外,我们就会在这个方向上改变速度。无损失的反弹并不完全符合牛顿物理定律,但这是我们所需要的。
在第23行,我们通过填充黑色RGB颜色来擦除屏幕。
如果你从未使做过动画,这可能看起来很奇怪。你可能会问“为什么我们需要擦除任何东西,为什么我们不把球移到屏幕上呢?”
这并不是电脑动画的工作方式。动画只不过是一系列的单一图像,当它们按顺序显示时,就能很好地欺骗人类的眼睛,感觉到了运动。
屏幕只是用户看到的单个图像。如果我们没有花时间把球从屏幕上抹去,我们就会看到球的“轨迹”,以前的球不会消失。因为我们不断地在新位置上画出球。
在第24行,我们把球图像画在屏幕上。图像的绘制是由Surface.blit()方法处理的。一个blit基本上意味着将像素的颜色从一个图像复制到另一个图像。我们通过blit方法将一个源表面复制,并将源放置到目的地。
我们需要做的最后一件事是更新显示区域。
Pygame用一个双缓冲来管理显示。当我们完成绘图时,我们调用pygame.display.flip()将完整显示内容更新到屏幕方法。
这使得我们在屏幕上绘制的所有东西可见。这个缓冲确保我们只看到屏幕上完全绘制的帧。
如果没有它,用户将会看到屏幕上已经完成的一半。
这是对pygame的简短介绍。
Pygame还提供了一些模块来处理键盘、鼠标和游戏操纵杆等问题。它可以混合音频和解码流音乐。有了surface模块,你就可以画出简单的形状,旋转和缩放图片,甚至可以实时地操纵图像像素,就像numpy数组一样。
Pygame还具有充当PyOpenGL的跨平台显示层的功能。
大多数pygame模块都是用C编写的,实际上很少是用Python完成的。
pygame网站(pagame.org)为每个pygame功能和教程提供完整的参考文档。pygame的资源库有很多例子,比如猴子的拳打和飞碟射击。
PYTHON 与游戏编程
“Python适合游戏吗?”
答案是,“这取决于游戏。”
Python实际上非常擅长于运行游戏。
它甚至可能会让你惊讶,在30毫秒的时间内,有多少可能。
不过,一旦你的游戏开始变得更加复杂,你就很难达到这个上限。任何实时运行的游戏都将充分利用电脑的运算能力。
在过去几年,游戏开发中出现了一种有趣的趋势,即转向更高层次的语言。
通常一种游戏被分成两个主要部分。游戏引擎,它必须尽可能快。游戏逻辑,使引擎能做一些事情。
就在不久之前,游戏的引擎是用汇编语言编写的,现在C已经转移到游戏引擎中,而游戏本身通常是用高级脚本语言编写的。像Quake3和虚幻这样的游戏将这些脚本作为可移植的字节码运行。
2001年初,开发商Rebel Act Studios工作室完成了他们的游戏Severance: Blade of Darkness。
此游戏使用他们自己的定制3D引擎,游戏的其余部分都是用Python编写的。
游戏主角是第三个人视角的战士。在探索地牢和城堡的过程中,你可以控制中世纪的战士,形成复杂的斩首组合攻击。
您可以下载这个游戏的第三方插件,并且发现它们都是Python源文件。
最近,Python已经被用于各种各样的游戏,如Freedom_Force,以及Humungous的后院体育系列。 ../_images/intro_freedom.jpg
Pygame和SDL是2D游戏的优秀C引擎。
游戏仍然会发现运行时最大的部分是在SDL中处理图形。SDL可以利用图形硬件加速的优势。启用这一功能可以改变游戏的速度,从每秒40帧到每秒200帧。
当您看到您的Python游戏以每秒200帧的速度运行时,您会意识到Python和游戏可以协同工作。
Python和SDL在多个平台上的工作表现令人印象深刻。
例如,在2001年5月,我发布了我自己的完整的pygame项目——SolarWolf,一个街机式动作游戏。
有一件事让我感到惊讶,一年之后也不需要任何补丁、bug修复或更新。
这个游戏完全是在windows上开发的,但是在Linux、Mac OSX和许多unix上运行,没有任何额外的配置。
尽管如此,也有非常明显的限制。
管理图形硬件加速的最好方法并不总是从软件渲染。
硬件支持在所有平台上都不可用。当游戏变得更复杂时,它通常必须多人协作。
SDL有一些设计限制,像全屏播放的图形可以快速地将你的游戏降低到非常低的速度。
虽然SDL不适合所有类型的游戏,但像Loki这样的公司已经使用SDL来运行各种各样的零售游戏。
在写游戏的时候,Pygame要求相当低。
你很快发现需要将通用函数封装到自己的游戏环境中。
重要的是,在pygame中没有任何东西可以阻挡你的前进道路。你的程序完全控制了一切。
这样做的副作用是你会发现需要更多代码来得到一个更高级的框架。你需要了解更多的功能
结束语
开发游戏是非常有益的,能够与您所编写的代码交互是令人兴奋的。
Pygame目前有近30个项目在使用它。部分游戏已经上市。
你在访问pygame网站时,可能对其他用户用Python做了什么感到惊讶的。
有一件事引起了我的注意,那就是用Python来尝试游戏开发的人员,很多人把游戏当做python的入门。
我可以理解为什么游戏会吸引新程序员,但从游戏开始可能比较困难,因为创建游戏需要对语言有更深入的理解。
通过为新用户编写更多示例来理解一些游戏的概念。也让pygame教程来支持这一群用户。
我最后的建议:保持简单。保持简单。保持简单。
重要的事情强调三次。
如果你打算创建你的第一个游戏,你会学到很多东西。
即使是一个简单的游戏也会挑战你的设计,而复杂的游戏并不一定意味着有趣的游戏。
当初步理解Python后,你可以用pygame在一到两周内创建一个简单的游戏。
从此你需要大量的时间来打磨你的作品,才能成为一款相当高大上的游作品!
Pygame 模块概览
------------|------------------------------------------------
- [ ] - cdrom | 回放
- [ ] - cursor | 指针
- [ ] - display | 控制显示屏幕
- [ ] - draw | 把图形画到表面
- [ ] - event | 管理事件和事件队列
- [ ] - font | 创建和渲染字体
- [ ] - image | 保存和载入图片
- [ ] - joystick | 游戏摇杆
- [ ] - key | 键盘管理
- [ ] - mouse | 鼠标管理
- [ ] - sndarray | 使用numpy调用声音
- [ ] - surfarray | 使用numpy调用图像
- [ ] - time | 控制时间
- [ ] - transform | 旋转、缩放和翻转图片
翻译:易景互动(panosoft.cn)
杨晓宏 (561071777@qq.com)
网友评论