如何在Python 3中安装pygame并创建用于开发游戏的模板

介绍

Pygame库是专门为了帮助您做出的游戏和其他多媒体应用Python编程语言的一个开放源代码模块。pygame 构建于高度可移植的SDL(Simple DirectMedia Layer)开发库的基础之上,可以运行在许多平台和操作系统上。

通过使用pygame模块,您可以控制游戏的逻辑和图形,而无需担心处理视频和音频所需的后端复杂性。

本教程将首先将pygame安装到您的Python编程环境中,然后引导您创建一个模板以使用pygame和Python 3开发游戏。

准备

为了能够使用本教程,请确保已在本地计算机或服务器上安装了Python 3和编程环境。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器

您还应该熟悉以下Python编程概念:

通过设置编程环境并熟悉Python编程,您可以开始使用pygame。

安装pygame

让我们从激活Python 3编程环境开始:

. my_env/bin/activate

启用此功能后,您可以使用pip安装pygame:

pip install pygame

运行此命令后,您应该看到类似于以下内容的输出:

Collecting pygame
  Using cached pygame-1.9.3-cp35-cp35m-manylinux1_x86_64.whl
Installing collected packages: pygame
Successfully installed pygame-1.9.3

如果你已经将pygame安装到一个有视频和音频的系统中,你可以通过运行以下命令验证你的安装,该命令将运行一个模拟游戏,展示pygame可以用图形和声音做什么:

python -m pygame.examples.aliens

如果您不想打开示例,或者如果您没有将AV作为设置的一部分,您还可以进入Python交互式控制台以确保您可以导入pygame模块。首先,键入python启动控制台的命令:

python

然后在控制台中导入模块:

import pygame

如果按照命令按ENTER键后没有收到任何错误,您将知道pygame已成功安装。您可以使用quit()命令退出Python交互式控制台。

如果您在命令行上遇到安装问题,可以查看pygame的安装教程

在后面的步骤中,我们将假设使用监视器来显示图形用户界面,作为本教程的一部分来验证我们的代码。

导入pygame

为了熟悉pygame,让我们创建一个名为our_game.py的文件,我们可以使用nano文本编辑器创建,例如:

nano our_game.py

在pygame中开始项目时,您将从用import导入模块的语句开始,您可以在文件顶部添加该语句:

import pygame

我们还可以选择在第一行下面添加另一个import语句,将pygame的一些常量和函数添加到文件的全局命名空间中:

import pygame
from pygame.locals import *

将pygame导入我们的程序文件后,我们就可以使用它来创建游戏模板了。

初始化pygame

从这里开始,我们将使用函数初始化pygame的init()功能,这是“初始化”的缩写。

import pygame
from pygame.locals import *
​
​
pygame.init()

init()函数将自动启动您需要初始化的所有pygame模块。

您还可以单独初始化每个pygame的模块,如下所示:

pygame.font.init()

如果您愿意,init()函数将向您返回一个元组。这个元组将显示成功和不成功的初始化。我们可以为一般init()调用和特定模块的初始化(这将向我们显示这些模块是否可用)执行此操作:

i = pygame.init()
print(i)
​
f = pygame.font.init()
print(f)

如果我们运行上面的代码,我们将收到类似于以下内容的输出:

(6, 0)
None

在这种情况下,i 变量返回元组(6, 0),这表明有6个成功的pygame初始化和0个失败。f变量返回None,表示该模块在此特定环境中不可用。

设置显示表面

从这里开始,我们需要设置我们的游戏显示表面。我们将使用pygame.display.set_mode()来初始化窗口或屏幕进行显示并将其传递给变量。在函数中,我们将传递显示分辨率的参数,该参数是一对表示元组中宽度和高度的数字。让我们将这个函数添加到我们的程序中:

import pygame
from pygame.locals import *
​
​
pygame.init()
​
game_display = pygame.display.set_mode((800, 600))

我们将元组(800, 600)作为set_mode()函数的参数传递,代表宽度(800像素)和高度(600像素)的分辨率。请注意,元组包含在函数的括号中,因此上面的函数中有双括号。

您可能经常使用整数来解决游戏的分辨率,因此您可能希望将这些数字分配给变量,而不是一次又一次地使用这些数字。当您需要修改程序时,这更简单,因为您只需要修改传递给变量的内容。

我们将使用变量display_width作为游戏显示的宽度,以及display_height高度,并将这些变量传递给set_mode()函数:

import pygame
from pygame.locals import *
​
​
pygame.init()
​
display_width = 800
display_height = 600
​
game_display = pygame.display.set_mode((display_width, display_height))

此时,游戏显示表面设置有宽度和高度的分辨率。

更新显示

接下来,我们需要使用两个可用函数之一来更新游戏表面的显示。

动画通常是随着时间的推移在不同帧之间的变化。在考虑动画时,您可能会想到一本翻书,因为它们包含一系列从一页到下一页逐渐变化的图像。当页面内容看起来处于运动状态时,这些页面可以快速翻动时模拟运动。在计算机游戏中,使用帧而不是页面。

由于翻页或框架的概念,可以使用其中一个可用于更新游戏表面显示的功能flip(),并且可以在上面的文件中调用,如下所示:

pygame.display.flip()

flip()功能将整个显示表面更新到屏幕。

更常见的是,使用update()函数代替flip()函数,因为它只更新屏幕的某些部分,而不是整个区域,从而节省内存。

让我们将update()函数添加到our_game.py文件的底部:

import pygame
from pygame.locals import *
​
​
pygame.init()
​
display_width = 800
display_height = 600
​
game_display = pygame.display.set_mode((display_width, display_height))
​
pygame.display.update()

此时,您可以毫无错误地运行程序,但显示表面只会打开并快速关闭。

创建游戏循环

随着pygame的导入和初始化,显示集以及游戏界面的更新,我们可以开始处理我们的主游戏循环。

我们将创建一个运行游戏的while循环。循环将调用布尔值True,这意味着循环将永远循环,除非它被中断。

在我们程序的主游戏循环中,我们将构造一个for循环来迭代事件队列中的用户事件,该事件队列将由pygame.event.get()函数调用。

此时,我们在for循环中没有任何内容,但我们可以添加一个print()语句来表明代码的行为与我们期望的一样。我们将迭代中的事件以print(event)的形式传递给语句。

让我们将这两个循环和print()语句添加到我们的程序文件中:

import pygame
from pygame.locals import *
​
​
pygame.init()
​
display_width = 800
display_height = 600
​
game_display = pygame.display.set_mode((display_width, display_height))
​
pygame.display.update()
​
while True:
    for event in pygame.event.get():
        print(event)

为了确保我们的代码正常工作,让我们运行程序:

python our_game.py

当我们运行该文件时,将弹出一个800x600的窗口。要测试事件,您可以将鼠标悬停在窗口上,在窗口中单击,然后按键盘上的键。这些事件将打印到您的控制台窗口。

您收到的输出将如下所示:

<Event(4-MouseMotion {'rel': (616, 355), 'buttons': (0, 0, 0), 'pos': (616, 355)})>
<Event(5-MouseButtonDown {'button': 1, 'pos': (616, 355)})>
<Event(6-MouseButtonUp {'button': 1, 'pos': (616, 355)})>
<Event(2-KeyDown {'scancode': 3, 'key': 102, 'unicode': 'f', 'mod': 0})>
<Event(3-KeyUp {'scancode': 3, 'key': 102, 'mod': 0})>
...

此输出显示正在发生的用户事件。这些事件将控制游戏,因为它们是由用户生成的。无论何时运行pygame.event.get()函数,您的代码都将参与这些事件。

在终端窗口中按CTRL+ C停止程序运行。

此时,您可以删除或注释掉print()语句,因为我们不需要具有所有此终端输出。

从这里开始,我们可以通过学习如何退出游戏来完成我们的模板。

退出

要退出pygame程序,我们可以先取消初始化相关模块,然后像往常一样退出Python。

pygame.quit()函数将取消初始化所有pygame模块,Python quit()函数将退出程序。

由于用户控制游戏功能和事件,我们还应该知道,当用户通过单击游戏窗口上角的“X”来请求关闭程序时,pygame.QUIT 会将其发送到事件队列。

让我们在事件处理for循环中使用条件if语句开始控制程序的流程:

import pygame
from pygame.locals import *
​
​
pygame.init()
​
display_width = 800
display_height = 600
​
game_display = pygame.display.set_mode((display_width, display_height))
​
pygame.display.update()
​
while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            quit()

在上面的代码中,我们说如果用户请求程序关闭,程序应该用pygame.quit()函数取消初始化pygame模块,并使用quit()函数退出程序。

由于我们已经导入了pygame.locals,我们可以唤起event.type并像之前一样QUIT(而不是pygame.在这些前面)。

虽然用户可能知道点击游戏窗口上角的“X”,但我们可能希望让某些其他用户事件触发退出程序的请求。我们可以使用KEYDOWN事件类型和一个或多个键来完成此操作。

KEYDOWN事件意味着用户正在按下键盘上的键。为了我们的目的,让我们说Q密钥(如“退出”)或ESC密钥可以退出程序。让我们在for循环中添加代表这一点的代码:

import pygame
from pygame.locals import *
​
​
pygame.init()
​
display_width = 800
display_height = 600
​
game_display = pygame.display.set_mode((display_width, display_height))
​
pygame.display.update()
​
while True:
    for event in pygame.event.get():
        if event.type == QUIT or (
             event.type == KEYDOWN and (
              event.key == K_ESCAPE or
              event.key == K_q
             )):
            pygame.quit()
            quit()

我们添加了布尔逻辑运算符,以便程序可以在用户单击游戏窗口上角的“X”时退出,或者如果用户按下了一个键,即退出键或Q键(注意这不区分大小写)。

此时,如果使用该python our_game.py命令运行程序,您将能够测试正在运行的游戏的功能,然后通过使用“X”图标退出窗口或按QESC键来退出。

代码改进和后续步骤

虽然上面的程序功能齐全,但我们可以采取一些措施来改进代码。

对于初学者,我们可以将while循环中的代码放入函数定义中:

def event_handler():
    for event in pygame.event.get():
        if event.type == QUIT or (
             event.type == KEYDOWN and (
              event.key == K_ESCAPE or
              event.key == K_q
             )):
            pygame.quit()
            quit()

这将使while循环更加整洁和浓缩,特别是当我们为游戏添加更多功能时。

另外,为了让游戏更加精致,我们可以在窗口的标题栏中添加一个标题(当前正在读取pygame window)。我们可以使用以下行:

pygame.display.set_caption('Our Game')

我们可以将上面的字符串'Our Game'设置为我们想要称之为游戏的任何内容。

此外,我们可以将pygame.display.update()功能移动到主游戏循环中。

现在,我们的完整代码如下所示:

import pygame
from pygame.locals import *
​
​
pygame.init()
​
display_width = 800
display_height = 600
​
game_display = pygame.display.set_mode((display_width, display_height))
pygame.display.set_caption('Our Game')
​
​
def event_handler():
    for event in pygame.event.get():
        if event.type == QUIT or (
             event.type == KEYDOWN and (
              event.key == K_ESCAPE or
              event.key == K_q
             )):
            pygame.quit()
            quit()
​
while True:
    event_handler()
​
    pygame.display.update()

您还可以考虑使用不同的方法来处理上面的代码,包括使用break语句在进入游戏退出之前退出循环。

从这里开始,您将继续学习如何通过绘图和精灵显示图像,动画图像和控制帧速率等。您可以通过阅读官方pygame文档继续了解pygame游戏开发。

结论

本教程引导您完成将开源模块pygame安装到Python 3编程环境中,以及如何通过设置可用于控制Python游戏主循环的模板来开始游戏开发。

想要了解更多关于安装pygame并创建用于开发游戏的模板的相关教程,请前往腾讯云+社区学习更多知识。


参考文献:《How To Install pygame and Create a Template for Developing Games in Python 3》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程微刊

2018年各大互联网前端面试题四(美团)

17620
来自专栏腾讯IVWEB团队的专栏

移动端 tryjs 异常捕获

上周处理了一下群活动的 badjs ,第一步是摆脱` Script error .`,捕获异常栈,找到自己是错在哪里? 分享一下移动端 tryjs 异常捕获的步...

37000
来自专栏猿人谷

PHP程序员应该掌握的10个技能

php程序员应该掌握的10个技能,看看你都掌握了哪些:   1、语法:必须熟练掌握 ,写代码的时候IDE的编辑器对某一行报错应该能够根据报错信息知道是什么样的语...

24270
来自专栏深度学习之tensorflow实战篇

python2.7进行爬虫百度POI代码(划分小网格算法)

查询许久,最终选择一个,之前一直py3.6不成功,换了2.7就好多了。如果有重复去下重即可。 这里面非常重要的基类对象的init()方法与超类方法,将在下面进行...

50270
来自专栏张善友的专栏

Expression Web设计工具

从MS company store买了个Expression web软件,在Vista下安装了一个,今后可以用这个工具和Vistual studio 2005协...

201100
来自专栏编程

一行 Python 代码实现并行

译者:caspar 译文:https://segmentfault.com/a/1190000000414339 原文:https://medium.com/b...

28990
来自专栏大史住在大前端

【Recorder.js+百度语音识别】全栈方案技术细节

技术栈:React+recorder-tool.js +recorder.js + Express + Baidu语音识别API

54530
来自专栏ChaMd5安全团队

zctf web100的简单分析

zctf web100的简单分析 From ChaMd5安全团队核心成员 Pcat web100 xctf2017第二站的zctf,web100的链接点开之后...

375150
来自专栏企鹅号快讯

Python实现一个带图形界面的爬虫

Python 是一个很简介高效的语言,许多的 Python 爱好者(包括我在内)都很喜欢用 Python 做爬虫,为什么会喜欢写爬虫,我对爬虫的感觉就是:它能给...

64550
来自专栏ytkah

群用户通过微信小程序可以更好地协作了

  今天,小程序向开发者开放了群ID的接口能力。简单地说,就是当你把小程序分享在群聊中,被点击后开发者可获取群ID和群名称,也方便更好地针对群场景提供个性化服务...

52550

扫码关注云+社区

领取腾讯云代金券