URLhttps://learnscript.net/zh-hant/pygame/pygame/
    複製連結移至說明  範例

    如何使用初始化和取消初始化遊戲?以及註冊結束函式,取得和設定錯誤訊息,取得版本等問題

    閱讀 10:14·字數 3072·發佈 
    Youtube 頻道
    訂閱 375

    本節中的「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 初始化遊戲以及結束處理,pygame 模組簡介·YouTube