URLhttps://learnscript.net/zh/pygame/pygame/
    复制链接转到说明  示例

    如何使用初始化和取消初始化游戏?以及注册退出函数,获取和设置错误消息,获取版本等问题

    我被代码海扁署名-非商业-禁演绎
    阅读 10:08·字数 3044·发布 

    本节中的“Pygame 包的pygame模块”并不是一种稳妥的说法,因为 Pygame 包和pygame模块可以指相同的内容。

    pygame 模块

    当你导入pygame模块时,也将导入 Pygame 包中的其他可用模块,当然,一些可选的模块可能不会被导入。

    初始化游戏

    pygame模块的init函数,可用于初始化游戏,实际上他只是初始化已经导入的来自于 Pygame 包的模块,当某个模块初始化失败时,init函数不会引发异常,相反的,该函数会返回初始化成功和失败的模块的个数。

    init()

    返回值

    init函数的返回值是一个形式类似于(numpass,numfail)的 Python 元组,其中numpass表示初始化成功的模块的个数,numfail表示初始化失败的模块的个数。

    单独初始化 Pygame 包中的各个模块

    事实上,以上提到的游戏初始化不是必须的,当你需要使用 Pygame 包的某个模块时,可以单独初始化他,而不必调用pygame模块的init函数,这可在某种程度上提升游戏的启动速度。

    这里需要指出,单独初始化某个模块,可能需要捕获初始化过程中抛出的异常。

    可以重复调用 init 函数

    你可以反复调用init函数,这没有任何问题,即便在调用quit函数之后。

    在下面的示例中,我们导入了pygame模块,并调用了其init函数。

    hello.py
    # 导入模块 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函数将产生实际效果,他会重新初始化相关模块。

    我们为之前的示例增加一些代码,用于判断游戏是否已经进行了初始化。

    hello.py
    # …
    # 是否已经初始化?
    print(f'初始化?{pygame.get_init()}')
    初始化?True

    取消初始化游戏

    pygame模块的quit函数,可用于取消初始化游戏,实际上他只是取消初始化 Pygame 包中的某些模块以释放相关的资源,被取消初始化的模块与init函数所初始化的模块是一致的。

    quit()

    quit 函数并不能真正的退出游戏

    quit函数并不会结束程序(相反的,在程序结束时quit函数将被自动执行,对于游戏开发人员来说,调用quit函数并不是必须的),游戏也不会真正退出,你需要使用常规方式使游戏结束,比如,结束while循环并执行剩余的所有代码。

    可以重复调用 quit 函数

    init函数一样,你可以反复调用quit函数,这没有任何的问题。

    hello.py
    # …
    # 取消初始化
    pygame.quit()

    为游戏注册退出函数

    pygame模块的register_quit函数,可用于为游戏注册退出函数(或方法),这些函数将被quit函数调用。由于quit函数会在程序结束时被自动调用,因此通过register_quit函数注册的退出函数总是会被执行。

    register_quit(callable)

    callable 参数

    callable参数是需要注册为游戏退出函数的函数(或方法),该函数不需要任何参数。

    多次调用 quit 函数不会导致注册的退出函数被多次执行

    虽然,你可以反复调用quit函数,但通过register_quit函数注册的退出函数只会被执行一次,即便在调用quit函数后,又调用了init函数。

    下面,添加一些代码,在quit函数被调用之前,我们定义并注册了一个退出函数my_quit

    hello.py
    # …
    # 定义一个退出函数
    def my_quit():
    	print('游戏结束了?')
    # 注册退出函数
    pygame.register_quit(my_quit)
    # …
    游戏结束了?

    为游戏引发错误

    pygame模块中的类error,是 Pygame 包所提供的标准异常类,他继承自RuntimeError。在代码中,你可以捕获类errorRuntimeError,以处理游戏中发生的错误。

    error(*args)

    args 参数

    可变参数args所包含的位置参数将用于创建异常,或包含一些与异常相关的重要信息。

    在下面的代码中,我们引发了一个异常,在捕获该异常后,显示了其相关信息。

    hello.py
    # …
    # 引发异常
    try:
    	raise pygame.error('无中生有的错误!')
    except RuntimeError as e:
    	print(e, type(e))
    # …
    无中生有的错误! <class 'pygame.error'>

    获取和设置游戏中的错误信息

    除了将错误消息传递给pygame模块的error对象,你还可以使用pygame模块的set_errorget_error函数来设置和获取游戏中的错误消息,不过,当开发人员决定自己抛出异常时,这种做法通常没有必要。

    一旦通过set_error函数设置了与错误有关的消息,那么就可以使用get_error函数来获取该消息。

    set_error(error_msg)

    error_msg 参数

    error_msg参数是包含游戏错误消息的字符串。

    get_error()

    返回值

    get_error函数的返回值是一个包含游戏错误消息的字符串。

    hello.py
    # …
    # 设置错误消息
    pygame.set_error('哪里有错?!')
    # 显示错误消息
    print(pygame.get_error())
    # …
    哪里有错?!

    使用 version 模块获取 Pygame 版本信息

    Pygame 包的version模块的变量ververnum包含了 Pygame 包的版本信息,其中变量ver是字符串,vernum是一个PygameVersion对象,他们所表示的版本信息相同。

    此外,version模块的变量rev是一个字符串,表示了 Pygame 包的存储库修订版本。

    hello.py
    # …
    # 获取 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表示补丁号。

    hello.py
    # …
    # 获取 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 采用的是大字节序。

    hello.py
    # …
    # 获取 SDL 的字节序
    print(pygame.get_sdl_byteorder())
    # …
    1234

    源码

    hello.py·codebeatme/pygame·GitHub

    讲解视频

    如何在 Pygame 中初始化游戏,以及退出处理·YouTube如何在 Pygame 中初始化游戏,以及退出处理·Bilibili