如何使用初始化和取消初始化遊戲?以及註冊結束函式,取得和設定錯誤訊息,取得版本等問題
訂閱 375
本節中的「Pygame 套件的pygame
模組」並不是一種穩妥的說法,因為 Pygame 套件和pygame
模組可以指相同的內容。
Pygame 初始化遊戲以及結束處理,pygame 模組簡介影片示範 YouTube
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