如何使用初始化和取消初始化游戏?以及注册退出函数,获取和设置错误消息,获取版本等问题
关注 1800
本节中的“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