Pygame引入


历史

Pygame于2000年的夏天开始研发。作为一名资深的C语言程序员,我同时接触到了Python和SDL。

你们也许已经很熟悉Python了,它当时还是1.5.2版本。也许我需要介绍介绍SDL,即Simple DirectMedia Layer。和DirectX一样,SDL也是一个跨平台的多媒体C语言开发库。它已被用于上百款开源的或商业的游戏的开发。

我当时是对这两个项目各自的简洁性印象深刻,不久之后,我就意识到把它们两个组合起来是个有趣的想法。

很快,我发现了一个已经这么做的小项目------PySDL。由Mark Baker创建的PySDL是对SDL的直接Python实现。尽管它的接口比直接用程序生成的接口更简洁,但我觉得它有着浓浓的“C风格"。PySDL项目的迅速失败,提示着我,我何不自己着手创建一个符合我心中设想的项目呢?。

我想创建出一个真正能够体现Python特色的项目。我的目标是,让简单的事能够被简单地完成,复杂的事能够被直接地实现。

Pygame项目开始于2000年10月,6个月后,pygame 1.0版本正式发布!


小试牛刀

我觉得,学习一个库,最好的方式就是直接去体验实例。在pygame研发早期,我用7行代码实现了一个弹球动画。现在,让我们用现在的pygame来实现一下相同的效果。下面的代码应该不算复杂,很容易就能看懂:

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")
ball_rect = ball.get_rect()

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

    ball_rect = ball_rect.move(speed)
    if ball_rect.left < 0 or ball_rect.right > width:
        speed[0] = -speed[0]
    if ball_rect.top < 0 or ball_rect.bottom > height:
        speed[1] = -speed[1]

    screen.fill(black)
    screen.blit(ball, ball_rect)
    pygame.display.flip()

在这里插入图片描述

这就是获得一个四处弹动的球你所需要的代码。

首先

import sys, pygame   

pygame.init() 

这两行是导入所需要的库以及初始化pygame,没什么值得注意的。

import pygame导入了pygame所有的包。调用pygame.init()初始化了所有这些模块。

screen = pygame.display.set_mode(size)

这一行,我们调用pygame.display.set_mode(),创建了一个图形窗口。Pygame和SDL将根据你的硬件设施自动寻找最佳图形显示方案。

在Pygame中,图片被抽象为Surface对象。dispaly.set_mode()方法返回的,就是一个表示实际显示窗口的Surface对象。在这个Surface对象上进行的任何绘画都将可以在显示器上显示。

ball = pygame.image.load("intro_ball.gif")

这一行,我们加载了我们的图片。Pygame继承了SDL的图片处理库,支持BMP,JPG,PNG,TGA,和GIF等众多图片格式。pygame.image.load()返回的,也是一个Surface对象,也就是我们的球。这个Surface对象保存了"intro_ball.gif"文件的所有色键(colorkey)和透明度(alpha transparency)等信息。

ball_rect = ball.get_rect()

这一行,我们创建了ball_rect变量。Rect对象是Pygame提供的一种实用且方便的对象,它代表一个矩形区域。在后面的代码中,我们将看到它有什么用。

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

这几行,我们的程序已经初始化完毕了,可以开始准备运行了。在无限循环(主循环)语句中,我们获取用户的输入,移动球,然后画出球。

如果你熟悉GUI编程,你也许已经有了事件(event)和事件循环(event loops)的操作经历了。在pygame里面,事件循环依旧是那样子的。我们一次又一次监听用户的输入,如果QUIT事件发生,就退出程序。退出程序之后,pygame会确保一切都被停止和关闭。

    ball_rect = ball_rect.move(speed)
    if ball_rect.left < 0 or ball_rect.right > width:
        speed[0] = -speed[0]
    if ball_rect.top < 0 or ball_rect.bottom > height:
        speed[1] = -speed[1]

是时候让我们的球动起来了。球的移动,就是球的矩形的位置的更新(ball_rect.move())。这里,我们判断球的矩形是否碰到画面的边界,如果碰到就转向。不是真正的牛顿物理,但已经足够用了。

	screen.fill(black)

这一行,我们用RGB形式的黑色涂满了屏幕,擦去了屏幕上原本的内容。如果你以前从来没有处理过动画,这种操作看起来也许会有点奇怪。你也许要问:“为什么我们一定要清除整个屏幕的内容,而不是仅仅移动那个球?"事实上,你说的这种方式,完全与计算机动画的方式不同。动画,仅仅只是一系列图像按照人眼不可察觉的速度进行更新,营造连续的效果来欺骗你的视觉。如果我们不擦除原来的球的话,你将看到球运动时连续的“移动轨迹”(图片重复),这将比你想象中的画面逊多了。

	screen.blit(ball, ball_rect)

这一行,我们将球画到了屏幕上。绘制图片的功能,由Surface.blit()方法来实现。blit(传图)意味着,将一幅图像的像素信息复制到另一幅图像上的某个位置。我们需要传两个参数,一个是被复制的图像(Surface对象,这里是ball),另一个是位置(这里是Rect对象ball_rect)。

	pygame.display.flip()

最后一步,我们更新屏幕的画面。pygame用双缓存器(double buffer)来管理画面的显示。当我们在屏幕上绘画完毕后,我们就要调用pygame.display.flip()方法来让屏幕上的绘画更新可见。这种缓冲方式使得用户看到的是全部绘画完毕的画面,而不是半成品。

以上,包含对Pygame的简短介绍。Pytgame还有很多前面没有提到的模块。它们可以处理很多事件,如键盘输入、鼠标点击等;它们还可以混合或解码音乐。有了Surface,你可以画一些简单的几何形状,可以旋转或缩放图像,甚至可以结合numpy实时操纵每个像素点。Pygame也能够胜任PyOpenGL的跨平台显示层的角色。Pygame的很多代码都是用C语言写成的,很少实际上是由Python完全实现。

Python与游戏

"Python适合游戏开发吗?"回答是,“得取决于游戏的类型。”

Python实际上非常适合于运行游戏。就算是30毫秒内能发生的事情也能惊讶到你。然而,大型的复杂的游戏仍旧会消耗你的内存直到达到上限。任何实时运行的游戏都会一直消耗计算机的资源。

过去的几年里,游戏开发领域一直都在朝着高级编程语言趋近。通常一个游戏会被分成两个部分:游戏引擎,它一定要快;游戏逻辑,它负责操作游戏引擎实现真正的功能。就在不久之前,游戏引擎都是大部分由汇编语言编写,小部分由C语言编写。现如今,C语言逐渐占领了游戏引擎的开发,而游戏逻辑,开始由其他高级语言进行编写。

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 上运行。

尽管如此,用Python编写游戏,还是有着非常明显的限制。管理硬件加速图形的最佳方法并不总是从软件渲染中获得最快结果的方法。并非所有平台都提供硬件支持。当游戏变得更复杂时,它通常必须致力于其中一个。SDL 还有一些其他的设计限制,比如全屏滚动图形会迅速将您的游戏速度降低到无法继续玩下去的地步。虽然 SDL 并不适合所有类型的游戏,但请记住,像 Loki 这样的公司已经使用 SDL 来运行各种小游戏。

Pygame 在编写游戏方面是相当低级的。您很快就会发现,你需要将一些常用的功能封装到自己的函数当中。好处是 ,pygame 内部将没有任何东西可以妨碍您的想法:您的程序可以完全控制一切。坏处是,你会发现自己需要借用很多代码来组合成一个更高级的框架。您必须要更好地了解自己在做什么才行。

结语

开发游戏是收益颇丰的,能够看到您编写的代码的效果并与之交互是一件令人兴奋的事情。Pygame 目前在被近 30 个其他项目使用。他们中的一些人现在已经斗志满满了。访问 pygame 网站,看看其他用户已经能够使用 Python 做什么,您可能会感到惊讶。

引起我注意的一件事是,第一次使用 Python 尝试游戏开发的人越来越多。我可以理解为什么游戏会吸引新程序员,但这可能很困难,因为创建游戏需要对语言有更深入的理解。我试图通过编写众多示例和 pygame 教程来支持这些新手小白们。

最后,我的建议,保持简单,循序渐进。我得强调这一点。如果您打算创建您的第一个游戏,要学的东西真的有很多。即使是再简单的游戏也会挑战您的代码设计,而更复杂的游戏并不一定意味着更有趣。当你了解 Python 后,你可以使用 pygame 在短短一两周内创建出一个简单的游戏。但你却需要大量的时间来润色它,以使其成为一个完整的可展示的游戏。


原文链接:https://www.pygame.org/docs/tut/PygameIntro.html

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值