使用 Pygame 模块通过 Python 构建游戏框架

本系列的第一部分通过创建一个简单的骰子游戏来探索 Python。现在是时候从头开始制作你自己的游戏了。
632 位读者喜欢这个。
Python game screenshot

OpenGameArt.org

在我的本系列的第一篇文章中,我解释了如何使用 Python 创建一个简单的、基于文本的骰子游戏。您还使用了 Turtle 模块来生成一些简单的图形。在本文中,您将开始使用一个名为 Pygame 的模块来创建一个带有图形的游戏。

Turtle 模块默认包含在 Python 中。任何安装了 Python 的人都拥有 Turtle。对于像 Pygame 这样的高级模块来说,情况并非如此。因为它是一个专门的代码库,您必须自己安装 Pygame。现代 Python 开发使用虚拟环境的概念,这为您的 Python 代码提供了自己的运行空间,并且还有助于管理您的应用程序使用的代码库。这确保了当您将 Python 应用程序传递给另一个用户玩时,您确切地知道他们需要安装什么才能使其工作。

您可以手动管理您的 Python 虚拟环境,也可以让您的 IDE 帮助您。现在,您可以让 PyCharm 完成所有工作。如果您没有使用 PyCharm,请阅读 László Kiss Kollár 关于管理 Python 包的文章

Pygame 入门

Pygame 是一个库,或者说是一个 Python 模块。它是一个通用代码的集合,可以防止您在编写每个新游戏时都重新发明轮子。您已经使用过 Turtle 模块,您可以想象如果您必须先编写代码来创建一个笔,然后再用它绘图,那将有多么复杂。Pygame 提供了类似的优势,但用于视频游戏。

一个视频游戏需要一个场景,一个它发生的背景世界。在 Pygame 中,有两种不同的方法来创建你的场景

  • 设置背景颜色
  • 设置背景图片

无论哪种方式,你的背景都只是一张图片或一种颜色。你的视频游戏角色无法与背景中的事物互动,所以不要把任何太重要的东西放在那里。它只是布景。

设置你的第一个 Pygame 脚本

要启动一个新的 Python 项目,您通常会在您的计算机上创建一个新文件夹,并将所有游戏文件放入此目录中。至关重要的是,您要将运行游戏所需的所有文件都保存在您的项目文件夹中。

PyCharm(或您使用的任何 IDE)可以为您完成此操作。

要在 PyCharm 中创建一个新项目,请导航到 File 菜单并选择 New Project。在出现的窗口中,输入您的项目名称(例如 game_001)。请注意,此项目保存在您主目录中的一个特殊的 PycharmProjects 文件夹中。这确保了您的游戏所需的所有文件都保存在一个地方。

创建新项目时,让 PyCharm 使用 Virtualenv 创建一个新环境,并接受所有默认设置。启用创建 main.py 文件(并设置一些重要默认设置)的选项。

New project settings in PyCharm

opensource.com

在您单击 Create 按钮后,一个新的项目将出现在您的 PyCharm 窗口中。该项目由一个虚拟环境(左列中列出的 venv 目录)和一个名为 main.py 的演示文件组成。

删除 main.py 的所有内容,以便您可以输入您自己的自定义代码。一个 Python 脚本以文件类型、您的姓名以及您想要使用的许可证开始。使用开源许可证,以便您的朋友可以改进您的游戏并与您分享他们的更改

#!/usr/bin/env python3
# by Seth Kenlon

## GPLv3
# This program is free software: you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <https://gnu.ac.cn/licenses/>.

然后告诉 Python 您想要使用哪些模块。在此代码示例中,您不必在每行上键入 # 字符或其后的任何内容。Python 中的 # 字符表示注释,代码中的注释留给您自己和其他编码人员。

import pygame  # load pygame keywords
import sys     # let  python use your file system
import os      # help python identify your OS

请注意,PyCharm 不理解 Pygame 是什么,并对其进行下划线标记,将其标记为错误。这是因为 Pygame 与 sys 和 os 不同,它不是默认包含在 Python 中的。您需要在您的项目目录中包含 Pygame,然后才能在代码中成功使用它。要包含它,请将鼠标悬停在 pygame 一词上,直到您看到一个通知弹出窗口解释错误。

单击警报框中的 Install package pygame 链接,并等待 PyCharm 将 Pygame 安装到您的虚拟环境中。

安装完成后,错误消失。

如果没有像 PyCharm 这样的 IDE,您可以使用 pip 命令手动将 Pygame 安装到您的虚拟环境中。

代码段

因为您将在此脚本文件中进行大量工作,因此在文件中创建节可以帮助您了解在哪里放置内容。您可以使用块注释来完成此操作,块注释是仅在查看源代码时才可见的注释。在您的代码中创建四个块。这些都是 Python 忽略的注释,但当您跟随这些课程时,它们是很好的占位符。当我编码时,我仍然使用占位符,因为它帮助我组织和计划。

'''
Variables
'''

# put variables here


'''
Objects
'''

# put Python classes and functions here


'''
Setup
'''

# put run-once code here


'''
Main Loop
'''

# put game loop here

接下来,设置您的游戏窗口大小。请记住,并非每个人都拥有大型计算机屏幕,因此最好使用适合“大多数”人的计算机的屏幕尺寸。

有一种方法可以切换全屏模式,就像许多现代视频游戏所做的那样,但由于您刚刚入门,请保持简单并仅设置一个尺寸。

'''
Variables
'''
worldx = 960
worldy = 720

Pygame 引擎需要一些基本设置,然后才能在脚本中使用它。您必须设置帧率,启动其内部时钟,并启动(使用关键字 init,表示 initialize)Pygame。

添加这些变量

fps   = 40  # frame rate
ani   = 4   # animation cycles

在 Setup 部分添加启动 Pygame 内部时钟的指令

'''
Setup
'''

clock = pygame.time.Clock()
pygame.init()

现在您可以设置您的背景了。

设置背景

在您继续之前,打开一个图形应用程序,并为您的游戏世界创建一个背景。将其另存为项目目录中名为 images 的文件夹中的 stage.png。如果您需要一个起点,您可以从 kenny.nl 下载一组 知识共享 背景。

您可以使用几个免费的图形应用程序来创建、调整大小或修改游戏的图形。

  • Pinta 是一款基本的、易于学习的绘图应用程序。
  • Krita 是一款专业级的绘画材料模拟器,可用于创建精美的图像。如果您对为视频游戏创作艺术非常感兴趣,您甚至可以购买一系列在线 游戏艺术教程
  • Inkscape 是一款矢量图形应用程序。使用它来绘制形状、线条、样条线和贝塞尔曲线。

您的图形不必很复杂,您可以随时返回并在以后更改它。一旦您有了背景,请在文件的 setup 部分添加此代码

world = pygame.display.set_mode([worldx,worldy])
backdrop = pygame.image.load(os.path.join('images','stage.png'))
backdropbox = world.get_rect()

如果您只是要用颜色填充游戏世界的背景,那么您只需要

world = pygame.display.set_mode([worldx, worldy])

您还必须定义要使用的颜色。在您的 setup 部分,使用红色、绿色和蓝色 (RGB) 的值创建一些颜色定义。

'''
Variables
'''

BLUE  = (25, 25, 200)
BLACK = (23, 23, 23)
WHITE = (254, 254, 254)

注意错误

PyCharm 非常严格,这对于编程来说是很典型的。语法至关重要!当您将代码输入到 PyCharm 中时,您会看到警告和错误。警告是黄色的,错误是红色的。

不过,PyCharm 有时可能过于热心,因此通常可以安全地忽略警告。您可能违反了“Python 风格”,但这些都是您会及时学习的细微约定。您的代码仍然会按预期运行。

另一方面,错误会阻止您的代码(有时甚至是 PyCharm)执行您期望的操作。例如,PyCharm 非常坚持在最后一行代码的末尾有一个换行符,因此您必须在代码末尾按下键盘上的 EnterReturn 键。如果您不这样做,PyCharm 会悄悄地拒绝运行您的代码。

运行游戏

此时,理论上您可以启动您的游戏。问题是,它只会持续一毫秒。

为了证明这一点,保存然后运行您的游戏。

如果您正在使用 IDLE,请从 Run 菜单中选择 Run Module 来运行您的游戏。

如果您正在使用 PyCharm,请单击右上角工具栏中的 Run file 按钮。

Run button

opensource.com

您也可以直接从 Unix 终端或 Windows 命令提示符运行 Python 脚本,只要您在您的虚拟环境中即可。

无论您如何启动它,都不要期望太多,因为您的游戏现在只持续几毫秒。您可以在下一节中修复它。

循环

除非另有说明,否则 Python 脚本只运行一次。现在的计算机非常快,因此您的 Python 脚本会在不到一秒的时间内运行。

要强制您的游戏保持打开和活动足够长的时间以便有人看到它(更不用说玩它了),请使用 while 循环。要使您的游戏保持打开状态,您可以将一个变量设置为某个值,然后告诉 while 循环只要该变量保持不变就继续循环。

这通常被称为“主循环”,您可以使用术语 main 作为您的变量。在您的 Variables 部分的任何位置添加此内容

main = True

在主循环期间,使用 Pygame 关键字来检测键盘上的键是否被按下或释放。将此添加到您的主循环部分

'''
Main loop
'''

while main:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            try:
                sys.exit()
            finally:
                main = False

        if event.type == pygame.KEYDOWN:
            if event.key == ord('q'):
                pygame.quit()
            try:
                sys.exit()
            finally:
                main = False

请务必在代码的最后一行之后按 EnterReturn,以便在文件的底部有一个空行。

同样在您的主循环中,刷新您世界的背景。

如果您正在使用图片作为背景

world.blit(backdrop, backdropbox)

如果您正在使用颜色作为背景

world.fill(BLUE)

最后,告诉 Pygame 刷新屏幕上的所有内容并推进游戏的内部时钟。

    pygame.display.flip()
    clock.tick(fps)

保存您的文件,然后再次运行它以查看有史以来最无聊的游戏。

要退出游戏,请按键盘上的 q 键。

冻结您的 Python 环境

PyCharm 正在管理您的代码库,但您的用户不会从 PyCharm 运行您的游戏。就像您保存您的代码文件一样,您也需要保留您的虚拟环境。

转到 Tools 菜单并选择 Sync Python Requirements。这会将您的库依赖项保存到一个名为 requirements.txt 的特殊文件中。当您第一次同步您的需求时,PyCharm 会提示您安装一个插件并添加依赖项。单击以接受这些提议。

Requirements

opensource.com

将为您生成一个 requirements.txt,并将其放置到您的项目目录中。

代码

以下是到目前为止您的代码应该的样子

#!/usr/bin/env python3
# by Seth Kenlon

# GPLv3
# This program is free software: you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <https://gnu.ac.cn/licenses/>.

import pygame
import sys
import os

'''
Variables
'''

worldx = 960
worldy = 720
fps = 40  # frame rate
ani = 4   # animation cycles
main = True

BLUE = (25, 25, 200)
BLACK = (23, 23, 23)
WHITE = (254, 254, 254)


'''
Objects
'''

# put Python classes and functions here


'''
Setup
'''

clock = pygame.time.Clock()
pygame.init()
world = pygame.display.set_mode([worldx, worldy])
backdrop = pygame.image.load(os.path.join('images', 'stage.png'))
backdropbox = world.get_rect()


'''
Main Loop
'''

while main:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            try:
                sys.exit()
            finally:
                main = False

        if event.type == pygame.KEYDOWN:
            if event.key == ord('q'):
                pygame.quit()
            try:
                sys.exit()
            finally:
                main = False
    world.blit(backdrop, backdropbox)
    pygame.display.flip()
    clock.tick(fps)

下一步做什么

在本系列的下一篇文章中,我将向您展示如何添加到您当前空旷的游戏世界中,所以开始创建或寻找一些图形来使用吧!

标签
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。他曾在电影和计算机行业工作,通常同时进行。
User profile image.
Jess Weichler 是一位数字艺术家,使用开源软件和硬件在数字世界和物理世界中创作作品,网址为 CyanideCupcake.com。

6 条评论

感谢您撰写关于 Pygame 的文章,非常感谢。但是,我想指出一些关于编写更“Pythonic”代码(根据 PEP8)的技巧
* 不要为了美观而对齐注释、等号、括号或任何其他内容。
* 与代码在同一行的注释应以两个空格开头。
* 当使用多行注释时,请使用双引号而不是单引号,即使您对字符串使用单引号也是如此。
* 逗号后加空格。
* 在条件表达式中(例如 while 循环条件),不要显式测试与 `True` 的相等性(`while main == True`);相反,只需执行 `while main`。如果您绝对需要测试某事物是 `True` 而不是 truthy,请执行 `while main is True`(身份比较而不是相等性)。
* 不要使用分号在一行中包含多个语句。

在以下行中,您似乎缺少结尾的括号

backdrop = pygame.image.load(os.path.join('images','stage.png').convert())

抱歉,我的意思是
backdrop = pygame.image.load(os.path.join('images','stage.png')).convert()

感谢提供此信息。我们可以在此框架中集成一些机器学习或深度学习用于游戏开发吗?

感谢这篇文章。我尝试并遵循了所有步骤,但我无法得到任何结果。您能否提供一个完整的脚本,其中包含对象、设置和其他位置的内容。

Creative Commons License本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。

您是开源新手吗?

浏览我们的资源集合。

© . All rights reserved.