如何為遊戲設定顯示驅動,OpenGL?以及取得圖形環境和視窗的資訊
訂閱 375
在 Pygame 中為遊戲設定顯示驅動
事實上,Pygame 套件似乎沒有提供直接設定顯示驅動的函式或方法,當display
模組進行初始化時,Pygame 將根據目前的作業系統和使用者權限,自行選擇遊戲所采用的顯示驅動。在 Windows 中,可采用的顯示驅動通常有windib
,directx
,在 UNIX/Linux 中,可采用的顯示驅動通常有x11
,dga
,fbcon
,directfb
,ggi
,vgl
,svgalib
,aalib
。
當然,你可以通過在作業系統中新增環境變數SDL_VIDEODRIVER
,來指定顯示驅動,比如,在 Windows 作業系統中,將SDL_VIDEODRIVER
設定為windib
。
取得目前顯示驅動的名稱
display
模組的get_driver
函式,可用於取得遊戲目前使用的顯示驅動的名稱。
get_driver()
- 傳回值
get_driver
函式的傳回值是一個表示顯示驅動名稱的字串。
# 匯入並初始化 display 模組
from pygame import display
display.init()
print(f'目前顯示驅動:{display.get_driver()}')
目前顯示驅動:windows
取得和設定 OpenGL 屬性
如果在呼叫set_mode
函式時,為參數flags
使用了OPENGL
,那麽你可以使用display
模組的gl_get_attribute
和gl_set_attribute
函式,來取得和設定與 OpenGL 相關的屬性。
gl_get_attribute(flag)
- flag 參數
flag
參數是需要取得的 OpenGL 屬性所對應的整數,一般會選擇pygame
模組中以GL_
開頭的變數作為該參數的值,比如GL_CONTEXT_MAJOR_VERSION
。- 傳回值
gl_get_attribute
函式傳回一個表示 OpenGL 屬性值的整數。
gl_set_attribute(flag, value)
- flag 參數
flag
參數是需要設定的 OpenGL 屬性所對應的整數,一般會選擇pygame
模組中以GL_
開頭的變數作為該參數的值,比如GL_CONTEXT_MAJOR_VERSION
。- value 參數
value
參數是一個整數,對應了 OpenGL 屬性的值。
gl_set_attribute 函式應該在建立遊戲視窗之前呼叫
要設定 OpenGL 的某些屬性,應該在建立遊戲視窗之前呼叫gl_set_attribute
函式,否則可能無法達到想要的效果。
顯示,視窗,熒幕
更多關於display
模組的set_mode
函式的資訊,請檢視建立遊戲視窗一段。
在下面的範例中,第三個函式gl_set_attribute
不會產生效果,因為set_mode
函式已經被呼叫。
# 匯入並初始化 display 模組
from pygame import display
display.init()
from pygame import OPENGL, FULLSCREEN, GL_CONTEXT_MAJOR_VERSION, GL_ACCELERATED_VISUAL, GL_DEPTH_SIZE
# 設定與 OpenGL 相關的屬性
display.gl_set_attribute(GL_CONTEXT_MAJOR_VERSION, 4)
display.gl_set_attribute(GL_ACCELERATED_VISUAL, 0)
# 建立一個采用 OpenGL 的全熒幕遊戲視窗
display.set_mode([0, 0], OPENGL | FULLSCREEN)
# 下面的陳述式不會產生效果
display.gl_set_attribute(GL_DEPTH_SIZE, 32)
# 取得與 OpenGL 相關的屬性
print(f'GL_CONTEXT_MAJOR_VERSION:{display.gl_get_attribute(GL_CONTEXT_MAJOR_VERSION)}')
print(f'GL_ACCELERATED_VISUAL:{display.gl_get_attribute(GL_ACCELERATED_VISUAL)}')
print(f'GL_DEPTH_SIZE:{display.gl_get_attribute(GL_DEPTH_SIZE)}')
GL_CONTEXT_MAJOR_VERSION:4
GL_ACCELERATED_VISUAL:0
# 並非程式碼中設定的 32
GL_DEPTH_SIZE:16
取得圖形環境資訊
display
模組的Info
函式,將傳回一個_VidInfo
物件,該物件包含與目前圖形環境相關的資訊。在呼叫set_mode
函式設定顯示模式之後,你可以呼叫Info
函式來驗證顯示模式是否已經生效。
Info()
- 傳回值
Info
函式傳回一個包含目前圖形環境資訊的_VidInfo
物件。
在建立遊戲視窗之前呼叫 Info 函式可能會獲得預設圖形環境的資訊
如果在建立遊戲視窗之前,呼叫Info
函式,那麽某些作業系統會提供預設圖形環境的資訊。
display
模組的_VidInfo
物件,僅簡單的包含了一些表示圖形環境資訊的變數,就目前而言,這些變數中的某些不會被設定,他們始終保持為0
。
- hw 變數
hw
變數可能始終保持為0
,如果為1
則表示已經啟用了硬體加速。- wm 變數
wm
變數始終保持為1
,表示視窗可以使用視窗模式顯示。- video_mem 變數
video_mem
變數可能始終保持為0
,表示用於顯示的記憶體大小(以兆位元組為單位),如果為0
則表示大小未知。- bitsize 變數
bitsize
變數表示用多少個 bit 來儲存一個像素。- bytesize 變數
bytesize
變數表示用多少個位元組來儲存一個像素。- masks,shifts,losses 變數
masks
,shifts
和losses
變數是包含四個整數的 Python 元組,四個整數被用於將色彩中的紅色,綠色,藍色,透明度寫入像素。- blit_hw,blit_hw_CC,blit_hw_A,blit_sw,blit_sw_CC,blit_sw_A 變數
blit_hw
,blit_hw_CC
,blit_hw_A
,blit_sw
,blit_sw_CC
,blit_sw_A
變數可能始終保持為0
,如果為1
則表示硬體或軟體加速的某一項功能已經啟用。- current_h 變數
current_h
變數是表示遊戲視窗表面高度的整數。- current_w 變數
current_w
變數是表示遊戲視窗表面寬度的整數。
下面,我們在建立遊戲視窗之前和之後,呼叫Info
函式來取得預設和目前的圖形環境資訊。
由於所設定的顯示模式並不支援全熒幕模式下的表面大小 400x300,最終的表面大小被 Pygame 設定為了 640x480。
# 匯入 display 模組和 FULLSCREEN,並進行初始化
from pygame import display, FULLSCREEN
display.init()
# 嘗試取得預設的圖形環境的資訊
info = display.Info()
print(f'預設的表面大小:{info.current_w}x{info.current_h}')
# 嘗試建立一個表面大小為 400x300 並全熒幕顯示的視窗
s = display.set_mode((400, 300), FULLSCREEN)
# 取得目前的圖形環境的資訊
info = display.Info()
print(f'表面大小:{info.current_w}x{info.current_h}')
預設的表面大小:2560x1440
表面大小:640x480
取得視窗資訊
display
模組的get_wm_info
函式,其傳回值是一個 Python 字典,包含了由作業系統提供的與遊戲視窗相關的資訊,字典中的鍵值組的鍵為字串型別。get_wm_info
可能不像你所期望的那樣實用,因為作業系統可能不會提供關於遊戲視窗的任何資訊,函式會傳回一個空的 Python 字典,而在另一些情況下,字典可能會包含一個鍵為window
的鍵值組,其值為遊戲視窗的控製碼。
get_wm_info()
- 傳回值
get_wm_info
函式的傳回值是一個 Python 字典,包含由作業系統提供的與遊戲視窗有關的資訊。
在下面的範例中,作業系統未提供與遊戲視窗有關的資訊。
# 匯入並初始化 display 模組
from pygame import display
display.init()
# 取得由作業系統提供的關於遊戲視窗的資訊
print(f'遊戲視窗資訊:{display.get_wm_info()}')
{}