大家好,我是赛博红兔。我们的《和我一起做3A游戏》系列要开始了!这个系列本质上是对pygame这个Python的游戏库的所有主要功能的介绍。通过这个教程,你应该能掌握制作任何2D游戏的工具,学完这一系列,咱们就可以做出这样一个练打字的游戏。我猜你肯定会说,等一下你这个标题党,不是说一起做一个3A游戏吗?对啊,是。。是这是3A游戏啊。Amusing,Adorable,Affordable,这不是3A嘛?其实,游戏制作本身并不是咱们这个系列的重点。我选择这个pygame的项目,可以很好的锻炼我们如何利用学到的python基础语法知识去开始一个小项目,体验从立项到方案到设计最后成品的过程;还可以练习如何去使用第三方库和模块来制作你的项目。在你继续看下去之前,你需要已经有一些Python的基础,虽然不需要很多,但至少你应该知道基本语法,数据结构,如何使用函数和方法,还有安装和导入库和模块。如果你能跟着我的《和我一起玩Python》初中阶教程学下来那就更好了。在做这个游戏的时候我们会使用面向对象编程的框架去编写。我知道可以不用,但是一般的写法观赏性和维护性很差,再去养成好的实践习惯就很难了,一开始可能会比较抽象,但是跟着我慢慢编写下去,你就会觉得整个程序的条例特别清晰。如果你对面向对象编程不是特别了解也没有关系,可以跟着我编写下来会有个很好的概念的,你还可以去看看《和我一起玩Python》的28,29集“面向对象编程”,了解更系统的知识。
我已经把这个游戏用到的资源、代码还有EXE的应用程序打包放在百度网盘了,链接会放在下面,代码也可以去我的GitHub或者博客下载。你可以按照上面的安装说明部署项目,都写得比较详细了。如果,只想玩这个游戏的朋友,可以直接运行我打包好的EXE应用文件,在电脑上直接跑不需要安装python,但是可能需要有声卡。记住,一定要把应用程序和assets也就是游戏资源包放在一起,不然会出错。
游戏完整代码及资源链接:https://pan.baidu.com/s/1AvAGRJI2ipDgyGEF0KJVdQ 提取码:gxzl
游戏GitHub项目:https://github.com/XingshengXu/A-Trip-Home
在我们开始实际编写游戏代码之前,不妨先来探讨一下视频游戏的基本运作机制。这不仅能帮助我们更好地理解pygame这一工具的功能,还能让我们了解它的工作原理。你可以将视频游戏想象为一部电影。本质上,电影是一连串快速播放的图像,视频游戏的原理也类似。拿《魔兽争霸》为例,如果你将游戏速度放慢,就能看到每一帧图像。一般电影每秒播放24帧,这足以让我们的眼睛感知到连续的动作。如果这个过程持续足够长的时间,我们最终就会看到一部大约一个半小时的电影。而视频游戏则在这基础上更进一步。游戏中的每一帧图像不是预先录制的,而是根据游戏中发生的实时事件动态生成的。比如,游戏会根据敌人的位置或玩家的操作来更新画面。这是游戏和电影的一大区别:游戏内容是实时动态生成的。此外,视频游戏还需要实时处理玩家的输入,如键盘点击和鼠标移动。这意味着在游戏绘制每一帧之前,首先要读取并响应玩家的输入,这一点是视频游戏独有的互动特性。
pygame创建与2007年结合了Python 和 SDL,也叫作简单的直接媒体层,一起编写而成的。所以你可以看到pygame对于图像渲染,创建2D的游戏非常在行。它提供了一系列丰富的功能,允许开发者通过简单的方式处理图形、声音、计时器、事件、碰撞、捕捉玩家输入等等多种游戏元素,上面这些我们都会学到。我个人觉得pygame最主要的作用是教学,使用pygame可以学习python和创建自己的游戏引擎系统,这比单纯依赖第三方提供的游戏引擎更有助于提升编程和制作游戏的技能。一旦你有了游戏制作的概念和更多的编程经验,就可以轻松地转到其他引擎上,进行专业游戏的开发。
那么我们开始用pygame做第一个小游戏,我把它叫作《A Trip Home》归乡之路。首先,当时我在立项的时候想把它做成一个练打字的游戏,因为如果盲打技术好的话对编程是很有帮助的。我小时候玩过小霸王里的一款练习五笔打字的游戏,那时候很着迷,可能我暴露年龄了啊,听不懂的小朋友来看看就像是这样的游戏。所以这个游戏的核心玩法就准备做出那些游戏一样。接下来的艺术概念就是,背景有青山绿草地和蓝天,还有花草树木之类的。一只可爱的小猫蹦跳着穿梭在树林之间,走在回家的路上。然后,在上方会显示需要打字的内容,每打对一个词小猫会高兴地叫着跳起来。然后,右上角有一个记分牌。最后,它走着走着就到家了,然后是一个展示分数画面,就是这么子供向。
导入模块和类
from sys import exit
import pygame as pg
from settings import *
from sys import exit: 从Python的标准库sys中导入exit函数,用于在游戏中退出程序。import pygame as pg: 导入pygame库,并用pg作为别名,方便后续调用。from settings import *: 从settings.py文件中导入所有变量,这可能包括一些配置,如WIDTH,HEIGHT,FPS,GROUND_WIDTH,GROUND_HEIGHT等。
定义Game类
class Game:
def __init__(self):
pg.init()
self.clock = pg.time.Clock()
self.screen = pg.display.set_mode((WIDTH, HEIGHT))
pg.display.set_caption('A Trip Home')
try:
self.sky_background = pg.image.load('assets/background/sky.png').convert()
self.ground_background = pg.image.load('assets/background/ground.png').convert()
except pg.error:
print('Error loading background image!')
self.sky_background = pg.transform.scale(self.sky_background, (WIDTH, HEIGHT))
self.ground_background = pg.transform.scale(self.ground_background, (WIDTH, GROUND_WIDTH))
- 定义了一个名为
Game的类,用于封装游戏的主要功能。 pg.init(): 初始化所有导入的pygame模块,为使用其他pygame功能做准备。pg.time.Clock(): 创建一个时钟对象,用于控制游戏的帧率。pg.display.set_mode((WIDTH, HEIGHT)): 设置游戏窗口的大小,WIDTH和HEIGHT从settings.py中获取。pg.display.set_caption('A Trip Home'): 设置游戏窗口的标题。pg.image.load('path'): 加载图片文件。.convert(): 转换图片格式,以更快地在pygame中使用。try-except: 异常处理,防止文件不存在或读取错误时程序崩溃。pg.transform.scale(): 调整图片大小,使其匹配窗口尺寸或特定区域。
主循环方法
def main_loop(self):
'''This is the game main loop.'''
while True:
self.clock.tick(FPS)
for event in pg.event.get():
if event.type == pg.QUIT:
pg.quit()
exit()
self.screen.blit(self.sky_background, (0, 0))
self.screen.blit(self.ground_background, (0, GROUND_HEIGHT))
pg.display.update()
self.clock.tick(FPS): 控制游戏的每秒帧数,FPS定义了每秒内循环次数。pg.event.get(): 获取所有事件队列。pg.QUIT: 检测是否按下关闭窗口按钮。pg.quit(): 关闭pygame,释放资源。exit(): 退出程序。self.screen.blit(): 在屏幕上绘制图像,blit用于将一张图像绘制到另一张图像上。pg.display.update(): 更新整个屏幕的显示,使改动可见。
运行游戏
# Run Main Loop
game = Game()
game.main_loop()
- 创建
Game类的实例,然后调用它的main_loop()方法来启动游戏。
好了,今天我们就先学到这里,大家按照我的代码自己写一写,玩一玩,记得保存下来下一节课还要接着用。希望大家能喜欢这个游戏,你可以先去玩一下完整的游戏版本。对,里头有很小几率才能遇到的彩蛋。那就这样,下期再见!

Leave a comment