如何使用初始化和取消初始化游戏?以及注册退出函数,获取和设置错误消息,获取版本等问题
关注 1260
本节中的“Pygame 包的pygame
模块”并不是一种稳妥的说法,因为 Pygame 包和pygame
模块可以指相同的内容。
如何在 Pygame 中初始化游戏,以及退出处理视频演示 YouTube如何在 Pygame 中初始化游戏,以及退出处理视频演示 Bilibili
pygame 模块
当你导入pygame
模块时,也将导入 Pygame 包中的其他可用模块,当然,一些可选的模块可能不会被导入。
初始化游戏
pygame
模块的init
函数,可用于初始化游戏,实际上他只是初始化已经导入的来自于 Pygame 包的模块,当某个模块初始化失败时,init
函数不会引发异常,相反的,该函数会返回初始化成功和失败的模块的个数。
init()
- 返回值
init
函数的返回值是一个形式类似于(numpass,numfail)
的 Python 元组,其中numpass
表示初始化成功的模块的个数,numfail
表示初始化失败的模块的个数。
单独初始化 Pygame 包中的各个模块
事实上,以上提到的游戏初始化不是必须的,当你需要使用 Pygame 包的某个模块时,可以单独初始化他,而不必调用pygame
模块的init
函数,这可在某种程度上提升游戏的启动速度。
这里需要指出,单独初始化某个模块,可能需要捕获初始化过程中抛出的异常。
可以重复调用 init 函数
你可以反复调用init
函数,这没有任何问题,即便在调用quit
函数之后。
在下面的示例中,我们导入了pygame
模块,并调用了其init
函数。
# 导入模块 pygame
import pygame
# 初始化其他模块
pygame.init()
判断游戏是否已经初始化
pygame
模块的get_init
函数,可用于判断游戏是否已经初始化(即是否已经通过init
函数进行了初始化)。当然,根据之前的说明,执行pygame.init()
并不是必须的,因此,在游戏的运行过程中,get_init
函数可能会返回False
。
get_init()
- 返回值
如果
get_init
函数返回True
,那么表示已经通过init
函数进行了初始化。
在取消初始化游戏之后,get_init 函数将返回 False
在调用quit
函数取消初始化游戏之后,get_init
函数将返回False
,这表示再次调用init
函数将产生实际效果,他会重新初始化相关模块。
我们为之前的示例增加一些代码,用于判断游戏是否已经进行了初始化。
# …
# 是否已经初始化?
print(f'初始化?{pygame.get_init()}')
初始化?True
取消初始化游戏
pygame
模块的quit
函数,可用于取消初始化游戏,实际上他只是取消初始化 Pygame 包中的某些模块以释放相关的资源,被取消初始化的模块与init
函数所初始化的模块是一致的。
quit()
quit 函数并不能真正的退出游戏
quit
函数并不会结束程序(相反的,在程序结束时quit
函数将被自动执行,对于游戏开发人员来说,调用quit
函数并不是必须的),游戏也不会真正退出,你需要使用常规方式使游戏结束,比如,结束while
循环并执行剩余的所有代码。
可以重复调用 quit 函数
和init
函数一样,你可以反复调用quit
函数,这没有任何的问题。
# …
# 取消初始化
pygame.quit()
为游戏注册退出函数
pygame
模块的register_quit
函数,可用于为游戏注册退出函数(或方法),这些函数将被quit
函数调用。由于quit
函数会在程序结束时被自动调用,因此通过register_quit
函数注册的退出函数总是会被执行。
register_quit(callable)
- callable 参数
callable
参数是需要注册为游戏退出函数的函数(或方法),该函数不需要任何参数。
多次调用 quit 函数不会导致注册的退出函数被多次执行
虽然,你可以反复调用quit
函数,但通过register_quit
函数注册的退出函数只会被执行一次,即便在调用quit
函数后,又调用了init
函数。
下面,添加一些代码,在quit
函数被调用之前,我们定义并注册了一个退出函数my_quit
。
# …
# 定义一个退出函数
def my_quit():
print('游戏结束了?')
# 注册退出函数
pygame.register_quit(my_quit)
# …
游戏结束了?
为游戏引发错误
pygame
模块中的类error
,是 Pygame 包所提供的标准异常类,他继承自RuntimeError
。在代码中,你可以捕获类error
或RuntimeError
,以处理游戏中发生的错误。
error(*args)
- args 参数
可变参数
args
所包含的位置参数将用于创建异常,或包含一些与异常相关的重要信息。
在下面的代码中,我们引发了一个异常,在捕获该异常后,显示了其相关信息。
# …
# 引发异常
try:
raise pygame.error('无中生有的错误!')
except RuntimeError as e:
print(e, type(e))
# …
无中生有的错误! <class 'pygame.error'>
获取和设置游戏中的错误信息
除了将错误消息传递给pygame
模块的error
对象,你还可以使用pygame
模块的set_error
和get_error
函数来设置和获取游戏中的错误消息,不过,当开发人员决定自己抛出异常时,这种做法通常没有必要。
一旦通过set_error
函数设置了与错误有关的消息,那么就可以使用get_error
函数来获取该消息。
set_error(error_msg)
- error_msg 参数
error_msg
参数是包含游戏错误消息的字符串。
get_error()
- 返回值
get_error
函数的返回值是一个包含游戏错误消息的字符串。
# …
# 设置错误消息
pygame.set_error('哪里有错?!')
# 显示错误消息
print(pygame.get_error())
# …
哪里有错?!
使用 version 模块获取 Pygame 版本信息
Pygame 包的version
模块的变量ver
和vernum
包含了 Pygame 包的版本信息,其中变量ver
是字符串,vernum
是一个PygameVersion
对象,他们所表示的版本信息相同。
此外,version
模块的变量rev
是一个字符串,表示了 Pygame 包的存储库修订版本。
# …
# 获取 Pygame 版本
print(pygame.version.ver)
print(pygame.version.vernum)
# …
2.6.1
2.6.1
获取 SDL 的版本信息
pygame
模块的get_sdl_version
函数,其返回值是一个元组,该元组包含了 SDL(Simple DirectMedia Layer)的版本信息。
get_sdl_version(linked=True)
- linked 参数
如果
linked
参数为True
,则函数get_sdl_version
返回当前所使用的 SDL 的版本信息(与version
模块的SDL
变量所表示的版本信息相同,SDL
变量是一个SDLVersion
对象),否则函数get_sdl_version
返回 Pygame 包在编译时所针对的 SDL 版本。- 返回值
get_sdl_version
函数的返回值是一个形式类似于(major,minor,patch)
的 Python 元组,其中major
表示主要版本号,minor
表示次要版本号,patch
表示补丁号。
# …
# 获取 SDL 版本
print(f'当前使用的 SDL 版本:{pygame.get_sdl_version()}')
print(f'编译时针对的 SDL 版本:{pygame.get_sdl_version(False)}')
# …
当前使用的 SDL 版本:(2, 28, 4)
编译时针对的 SDL 版本:(2, 28, 4)
获取 SDL 的字节序
pygame
模块的get_sdl_byteorder
函数,可用于获取 SDL(Simple DirectMedia Layer)的字节序。
get_sdl_byteorder()
- 返回值
get_sdl_byteorder
函数的返回值是整数1234
(对应pygame
模块的LIL_ENDIAN
变量)或4321
(对应pygame
模块的BIG_ENDIAN
变量),如果返回1234
,那么表示 SDL 采用的是小字节序,如果返回4321
,那么表示 SDL 采用的是大字节序。
# …
# 获取 SDL 的字节序
print(pygame.get_sdl_byteorder())
# …
1234
源码
讲解视频
如何在 Pygame 中初始化游戏,以及退出处理·YouTube如何在 Pygame 中初始化游戏,以及退出处理·Bilibili