Pygame 官方文档 - Tutorials - Pygame模块介绍(Introduction to Pygame)

Python 的Pygame模块介绍(Python Pygame Introduction)

Author: Pete Shinners
Contact: [email protected]
        这篇文章为Python程序员介绍了pygame库。 原始版本出现在Py Zine,第1卷第3期。此版本包含一些小修订,以创建一个全面的更好的文章。 Pygame是一个Python扩展库,它包装了SDL库及其助手。

历史(HISTORY)
        Pygame始于2000年夏天。作为一名多年的C程序员,我几乎同时发现了Python和SDL。您已熟悉Python,版本为1.5.2。您可能需要SDL的介绍,即Simple DirectMedia Layer。 SDL由Sam Lantinga创建,是一个用于控制多媒体的跨平台C库,与DirectX相当。它已被用于数百种商业和开源游戏。我对两个项目的干净和简洁感到印象深刻,不久之后我意识到混合Python和SDL是一个有趣的提议。
        我发现了一个已经完成的小项目,具有完全相同的想法,PySDL。由Mark Baker创建,PySDL是一个简单的SDL实现,作为Python扩展。界面比通用的SWIG包装更干净,但我觉得它强制使用“C风格”的代码。 PySDL的突然死亡促使我接受了我自己的新项目。
我想组建一个真正充分利用Python的项目。我的目标是让做简单的事情变得容易,并且能直接做出困难的事情。 Pygame项目于2000年10月启动。六个月后,pygame版本1.0发布。

尝试(TASTE)
        我发现了解新库的最佳方法是直接跳到一个例子中。 在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()

        这就像你可以获得一个弹跳动画一样简单。首先,我们看到导入和初始化pygame并不值得注意。导入pygame使用所有可用的pygame模块导入包。对pygame.init()的调用初始化了每个模块。
        在第8行,我们创建了一个图形窗口,调用pygame.display.set_mode()。 Pygame和SDL通过默认为图形硬件的最佳图形模式使这变得容易。您可以覆盖模式,SDL将补偿硬件无法执行的任何操作。 Pygame将图像表示为Surface对象。 display.set_mode() 函数创建一个新的Surface对象,该对象表示实际显示的图形。您对此Surface对象所做的任何绘图都将在显示器上显示。
        在第10行,我们加载球的图像。 Pygame通过SDL_image库支持各种图像格式,包括BMP,JPG,PNG,TGA和GIF。 pygame.image.load()函数返回一个带有球数据的Surface对象。 Surface对象将保留文件中的任何颜色键(colorkey)或Alpha透明度。加载球图像后,我们创建一个名为ballrect的变量。 Pygame附带一个名为Rect的方便的实用程序对象类型,它表示一个矩形区域。稍后,在代码的动画部分,我们将看到Rect对象可以做什么。
        此时,第13行,我们的程序已初始化并准备运行。在无限循环(死循环)中,我们检查用户输入,移动球,然后绘制球。如果您熟悉GUI编程,那么您就具有事件和事件循环的经验。在pygame中,这没有什么不同,我们检查是否发生了QUIT事件。如果是这样,我们只需退出程序,pygame将确保一切都干净利落。
        是时候更新球的位置了。第17到21行将ballrect变量用目前速度移动。如果球移动到屏幕外,我们将朝那个方向反转速度。不完全是牛顿物理学,但它是我们所需要的。
        在第23行,我们通过填充黑色RGB颜色来擦除屏幕。如果您从未使用动画,这可能看起来很奇怪。你可能会问“我们为什么要擦掉任何东西,为什么我们不仅把球移到屏幕上?”这不是计算机动画的工作方式。动画只不过是一系列单个图像,按顺序显示时,可以很好地愚弄人眼看动作。屏幕只是用户看到的单个图像。如果我们没有花时间从屏幕上擦掉球,我们实际上会看到球的“踪迹”,因为我们不断将球拉到新位置。
        在第24行,我们将球图像绘制到屏幕上。图像的绘制由Surface.blit()方法处理。 blit基本上意味着将像素颜色从一个图像复制到另一个图像。我们将blit方法传递给要复制的源(source)Surface,以及将源放置到目标上的位置。
        我们需要做的最后一件事是实际更新可见显示。 Pygame使用双缓冲区管理显示(display)。当我们完成绘制时,我们调用pygame.display.flip()将完整显示Surface更新为屏幕方法。这使得我们在屏幕Surface上绘制的所有内容都变得可见。这种缓冲确保我们只能在屏幕上看到完全绘制的帧。没有它,用户将在创建时看到屏幕的一半完成部分。
        这是对pygame的简短介绍。 Pygame还有一些模块可以处理键盘,鼠标和摇杆(joystick)的输入处理。pygame可以混合音频和解码流媒体音乐。使用Surfaces,您可以绘制简单的形状,旋转和缩放图片,甚至可以实时处理图像的像素作为numpy数组。 Pygame还具有作为PyOpenGL的跨平台显示层的能力。大多数pygame模块都是用C语言编写的,实际上很少用Python完成。
        pygame网站提供了针对所有pygame函数的完整参考文档以及适用于所有用户范围的教程。 pygame源附带了许多例如 monkey punching和UFO射击的例子。

Python和游戏
        “Python适合游戏吗?”答案是,“这取决于游戏。”
        Python实际上非常有能力运行游戏。甚至可能会在30毫秒内让您感到惊讶。尽管如此,一旦你的游戏开始变得更复杂,就不难达到上限。任何实时运行的游戏都将充分利用计算机。
        在过去几年中,游戏开发出现了一个有趣的趋势,即向更高级别的语言发展。通常游戏分为两个主要部分。游戏引擎必须尽可能快,以及游戏逻辑,这使得引擎确实做了一些事情。不久前,游戏的引擎是用汇编编写的,部分用C语言编写。现在,C已经转移到了游戏引擎,而游戏本身通常是用更高级别的脚本语言编写的。像雷神之锤III竞技场Quake3和虚幻引擎Unreal这样的游戏将这些脚本作为可移植字节码运行。

        2001年初,开发商Rebel Act Studios完成了他们的游戏,Severance:Blade of Darkness。使用他们自己的自定义3D引擎,游戏的其余部分是用Python编写的。这个是一个血腥的第三人称战斗游戏。在探索地下城和城堡的同时,你可以控制中世纪的战士进入错综复杂的斩首组合攻击。您可以为此游戏下载第三方附加组件,并发现它们只不过是Python源文件。

        最近,Python已被用于各种游戏,如自由力量Freedom Force和巨大后院运动Humungous’Backyard Sports Series。
        Pygame和SDL是2D游戏的优秀C引擎。游戏仍然会发现他们运行时的最大部分是在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在一两周内创建一个简单的游戏。从那里你需要花费大量的时间来添加抛光剂,使其成为一个完整的可展示游戏。

Pygame模块概述

模块名称 模块功能
cdrom 播放/回放
cursors 加载光标图像,包括标准指针
display 控制显示窗口或屏幕
draw 在Surface对象上绘制简单的形状
event 管理事件和事件队列
font create和render TrueType字体
image 保存和加载图像
joystick 管理操纵杆设备
key 管理键盘
mouse 管理鼠标
sndarray 用numpy操纵声音
surfarray 用numpy操纵图像
time 控制时间
transform 缩放,旋转和翻转图像

以上内容,自己翻译,可能有误,可参考:Tutorials - Pygame模块介绍(Introduction to Pygame)

点我回顶部

 
 
 
 
 
 
 
Fin.

猜你喜欢

转载自blog.csdn.net/Enderman_xiaohei/article/details/88640007