00 Python Pygame 简介

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行代码创建了一个跳跃的球动画。让我们来看看同样的东西。这是一个更友好的版本。
这应该足够简单,可以跟随我的解释,完全理解它们。

../_images/intro_ball.gif
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毫秒的时间内,有多少可能。
不过,一旦你的游戏开始变得更加复杂,你就很难达到这个上限。任何实时运行的游戏都将充分利用电脑的运算能力。

../_images/intro_blade.jpg

在过去几年,游戏开发中出现了一种有趣的趋势,即转向更高层次的语言。
通常一种游戏被分成两个主要部分。游戏引擎,它必须尽可能快。游戏逻辑,使引擎能做一些事情。
就在不久之前,游戏的引擎是用汇编语言编写的,现在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)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,377评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,390评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,967评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,344评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,441评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,492评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,497评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,274评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,732评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,008评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,184评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,837评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,520评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,156评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,407评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,056评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,074评论 2 352

推荐阅读更多精彩内容