编程派微信号:codingpy 编程派坚信,这个时代人人都学点编程,不论对自身成长还是日常工作,都将有巨大益处。因此,选择了通过本公号与大家分享最易学的编程语言 Python 的教程和资源,希望对你有帮助。 今天分享的是 Python 翻译组 最新译文,原文来自real python,是一篇比较详细的 PyGame 游戏开发入门指南。 译者:haiyuqiao,华中科技大学(在读研究生),正在使用 Python 做数据分析。Fighting from now!校对:EarlGrey,编程派主页君。 以下是正文,一起来学习吧。
PyGame是 SDL 库的 Python 包装器(wrapper)。SDL 是一个跨平台库,支持访问计算机多媒体硬件(声音、视频、输入等)。SDL 非常强大,但美中不足的是,它是基于 C 语言的,而 C 语言比较难懂,因此我们采用 PyGame 。 在本教程中,我们将介绍 PyGame 的基本逻辑和冲突检测,以及如何在屏幕上绘图和将外部文件导入到游戏中。
准备工作 打开PyGame下载页面,根据你的操作系统和 Python 版本下载合适的 PyGame 安装包。如果你使用的是 Python 3,那么请下载 1.9.2 版.
新建一个 .py 文件,然后输入以下代码: 与其他 Python 程序一样,我们首先导入想要使用的模块。这里,我们将导入 基础对象 屏幕对象 首先,我们需要一张画布,我们称之为“屏幕”,它是我们绘画的平台。为了创建一个屏幕,我们需要调用 screen = pygame.display.set_mode((800,600)) 运行上述代码,将会弹出一个窗口,然后当程序退出后又立即消失。一点都不酷嘛,对吧?下一节,我们将介绍游戏的主循环,它将确保只有在我们给它正确的输入时程序才会退出。 游戏主循环 游戏主循环/事件循环是所有操作发生的地方。在游戏过程中,它不断的更新游戏状态,渲染游戏画面和收集输入指令。创建循环时,需要确保我们有办法跳出循环,退出应用。为此,我们将同时介绍一些基本的用户输入指令。所有的用户输入(和我们稍稍后提到的其他事件)都会进入 PyGame 的事件队列,通过调用 将上述代码添加到之前的代码下,并运行。你应该看到一个空的窗口。只有你按下 ESC 键 或者触发一个 QUIT 事,否则这个窗口不会消失。 Surface 和 Rects
让我们创建一个 50x50 像素的 Surface,然后给它涂色。由于屏幕是黑色的,所以我们使用白色。 我们然后调用 Blit 和 Flip 仅仅只是创建了 Surface 并不能在屏幕上看到它。为此我们需要将这个 Surface 绘制(Blit)到另一个 Surface 上。Blit 是一个专业术语,意思就是绘图。你仅仅只能从一个Surface Blit 到另一个Surface,我们的屏幕就是一个 Surface 对象。以下是我们如何将 # 这一行表示:将surf画到屏幕 x:400.y:300的坐标上 screen.blit(surf,(400,300)) pygame.display.flip()
注意在 blit 之后的 Sprites 什么是 Sprites ?从编程术语来讲,Sprites 是屏幕上事物的二维表达。本质上来讲,Sprite 就是一个图片。Pygame 提供一个叫做 Sprites 的基础类,它就是用来扩展的,可以包含想要在屏幕上呈现的对象一个或多个图形表示。我们将会扩展Sprite 类,这样可以使用它的内建方法。我们称这个新的对象为 现在我们将上述代码整合在一起:
运行上述代码,你将会在屏幕中心看到一个白色的矩形: 如果将 用户输入 现在开始才是有趣的部分。我们要把 Player 变得可控制!之前我们提过,按键事件 pressed_keys = pygame.event.get_presssed() 现在我们将写一个方法,接收上面那个字典,并且根据按下的键定义 sprite 的行为,代码如下:
将上述方法添加到
现在你可以使用方向键移动矩阵块了。也许你注意到了,你可以将矩形块移出屏幕,这可能并不是你想要的。所以我们我们需要往 update 方法中添加一些逻辑,检测矩形的坐标是否移出了 800x600 的屏幕边界;如果出了边界,那么就将它放回在边界上: 上述代码没有使用 现在我们添加一些敌人! 首先我们创建一个新的 sprite 类,命名为 以上有几点需要说明。首先,当我们在 surface 上调用 在最终的代码中,我们会在文件的开头导入 Random 库( 敌人的 Groups Pygame 提供的另一个很有用的对象是 Sprite 的 Groups。诚如其名,是 Sprite 的集合。为什么我们要使用 sprite.Group 而不是列表呢? 因为 sprite.Group 有一些内建的方法,有助于解决冲突和更新问题。那现在就创建一个 Group,用来包含游戏中的所有 Sprites 。创建完 Group 后,我们要将 Player 添加到里面,因为它是我们目前唯一的 Sprite 。我们也可以为敌人创建一个 group 。 当我们调用 Sprite 的 enemies = pygame.sprite.Group() all_sprites = pygame.sprite.Group() all_sprites.add(player) 现在有了 现在,任何放到 自定义事件 现在我们为敌人创建了一个 sprite.Group ,但是并没有实际的敌人。那怎样才能在屏幕上出现敌人呢?我们当然可以在刚开始的时候创建一堆的敌人,但是这样游戏玩不了几秒。为此,我们创建一个自定义事件,它隔几秒钟就会触发创建一批敌人。我们要监听该事件,方式和监听按键或退出事件一样。创建自定义事件十分容易,只要命名即可: ADDENEMY = pygame.USEREVENT 1 这样就可以了!现在,我们有了一个叫做 定义好事件之后,我们需要将它插入事件队列中。因为整个游戏过程中都要创建它们,所以将设置一个计时器。可以通过 PyGame 的 pygame.time.set_timer(ADDENEMY,250) 这行代码告诉 PyGame 每隔 250 毫秒(四分之一秒) 触发一次
现在我们会监听 冲突 这才是 PyGame 的魅力所在!写冲突代码(collision code)很难,但是 PyGame 提供了很多冲突检测方法,你可以在这里查看其中一部分。本次教程使用 spritecollideany。 检测 player 是否
测试一下! 图片 现在游戏可以玩了,但是长得挺丑的。接下来,我们将白色方块变成有意思的图片,让游戏看上去有游戏的样子。 前面的代码示例中,我们使用了涂色的 Surface 对象表示游戏里的所有事物。虽然这样有助于理解什么是 Surface 和它如何工作,但是却让游戏变得很丑!现在我们要给 player 和 enemy 添加一些图片。我喜欢自己画图,我把 player 画成小飞机,enemy 是导弹,这些可以从我的代码库中下载。欢迎你使用我的作品,自己画或者者下载一些免费游戏素材。 修改对象的构造函数 下面是我们现在的 player 构造函数: 新的构造函数将会是这个样子的: 我们想用一张图片替代 Surface 对象。我们将使用 接下来,我们在图片上调用 最后,我们和之前一样调用
对 enemy 构造函数做同样的操作: 现在的游戏虽然和以前一样,但是比之前漂亮多啦!但是我仍然觉得它少了点什么东西。让我们加点不断漂浮的白云,这样会有飞机划过蓝天的感觉。为此,我们需要遵循之前用过的一些原则。首先,我们创建 上面的代码看起来都很熟悉,下面这个事件创建代码也一样,我们将它放在 enemy 事件代码下面:
现在为它们创建一个新的 Sprite.Group: clouds = pygame.sprite.Group() 现在,在主循环中,我们需要开始监听 下面的代码: 将会变成这样: 我们还要把 clouds 添加到 结语 大功告成!让我们测试一下,效果应该是这样的: 完整代码可以在 GitHub 上的代码库获取!希望本教程对你有用! 点此查看原文 Python 翻译组是EarlGrey@编程派发起成立的一个专注于 Python 技术内容翻译的小组,目前已有近 30 名 Python 技术爱好者加入。 翻译组出品的内容(包括教程、文档、书籍、视频)将在编程派微信公众号首发,欢迎各位 Python 爱好者推荐相关线索。 推荐线索,直接在编程派微信公众号推文下留言即可。 |
|