原文鏈接:https://xiets.blog.csdn.net/article/details/131382728
版權(quán)聲明:原創(chuàng)文章禁止轉(zhuǎn)載
專欄目錄:Pygame 專欄(總目錄)
1. 顯示窗口: display
pygame.display
模塊提供了對 pygame 顯示的控制??梢园?pygame.display
看做是包含了一個(gè) 系統(tǒng)窗口 的 顯示器屏幕。
pygame.display
模塊主要函數(shù):
# 設(shè)置顯示窗口的標(biāo)題
pygame.display.set_caption(title, icontitle=None)
# 設(shè)置顯示窗口的圖標(biāo)
pygame.display.set_icon(Surface)
# 初始化用于顯示的窗口或屏幕, 該函數(shù)將創(chuàng)建一個(gè)用于映射到系統(tǒng)窗口顯示的 Surface 圖像。
#
# size 顯示窗口的大小 (內(nèi)容窗口, 不包括標(biāo)題欄和邊框)
#
# flags 控制顯示類型, 可以用 位或|運(yùn)算 組合多種類型,
# flags 可取值:
# pygame.FULLSCREEN 創(chuàng)建全屏顯示 create a fullscreen display
# pygame.DOUBLEBUF 僅適用于OPENGL
# pygame.HWSURFACE 在 pygame 2 已過時(shí)
# pygame.OPENGL 創(chuàng)建 OpenGL 可渲染顯示
# pygame.RESIZABLE 顯示窗口大小可變
# pygame.NOFRAME 顯示窗口將沒有邊框或控件
# pygame.SCALED 分辨率取決于桌面大小和圖形縮放
# pygame.SHOWN 窗口以可見模式打開 (默認(rèn))
# pygame.HIDDEN 窗口以隱藏模式打開
#
# display 窗口在哪個(gè)顯示器上顯示, 用于連接了多個(gè)顯示器的情況, 如果 get_num_displays() == 2, 則 display=1 表示窗口顯示在第2個(gè)顯示器上
#
# depth 顏色深度, 通常最好不要傳遞 depth 參數(shù), 它將默認(rèn)為系統(tǒng)的最佳和最快顏色深度
#
# vsync 通過將 vsync 參數(shù)設(shè)置為 1, 可以獲得具有垂直同步的顯示器, 但不能保證獲得
#
# 返回一個(gè)與窗口內(nèi)容區(qū)域綁定的 Surface 圖像對象, 之后在此圖像上的繪制, 在調(diào)用 update() 或 flip() 函數(shù)后, 將同步顯示在屏幕窗口上
#
pygame.display.set_mode(size=(0, 0), flags=0, depth=0, display=0, vsync=0) -> Surface
# 更新屏幕顯示, 將 set_mode() 返回的 Surface圖像 中的內(nèi)容全部更新到顯示屏幕上
pygame.display.flip()
# 更新屏幕顯示, 只更新特定區(qū)域。如果沒有傳遞任何參數(shù), 則相當(dāng)于 flip(), 即 update() 相當(dāng)于 flip()。
pygame.display.update(rectangle=None)
pygame.display
模塊其他函數(shù):
pygame.display.init() # 初始化顯示模塊, 當(dāng)調(diào)用 pygame.init() 時(shí)會(huì)自動(dòng)調(diào)用
pygame.display.quit() # 關(guān)閉顯示模塊, 程序退出時(shí)自動(dòng)處理
pygame.display.get_init() -> bool # 如果顯示模塊已初始化, 則返回 True
pygame.display.get_active() -> bool # 當(dāng)前窗口的 Surface 在屏幕上處于活動(dòng)狀態(tài)時(shí)返回 True
pygame.display.get_caption() -> (title, icontitle) # 獲取顯示窗口的標(biāo)題
pygame.display.get_surface() -> Surface # 獲取當(dāng)前窗口的 Surface, 即 set_mode() 返回的對象
pygame.display.get_num_displays() -> int # 返回顯示器的數(shù)量
pygame.display.get_window_size() -> tuple # 返回窗口或屏幕的大小, 即 set_mode() 返回的 Surface 大小, 如果使用了 pygame.SCALED, 可能和 set_mode() 返回的 Surface 大小不一樣
pygame.display.get_wm_info() -> dict # 獲取有關(guān)當(dāng)前窗口系統(tǒng)的信息
pygame.display.get_desktop_sizes() -> list # 獲取激活狀態(tài)的顯示器分辨率大小
pygame.display.list_modes(depth=0, flags=pygame.FULLSCREEN, display=0) -> list # 獲取可用的全屏模式列表
pygame.display.toggle_fullscreen() -> int # 在 窗口模式 和 全屏模式之 間切換顯示窗口
pygame.display.mode_ok(size, flags=0, depth=0, display=0) -> depth # 為顯示模式選擇最佳顏色深度
pygame.display.iconify() -> bool # 圖標(biāo)化顯示Surface
pygame.display.set_gamma(red, green=None, blue=None) -> bool # 更改硬件伽馬斜坡
pygame.display.set_gamma_ramp(red, green, blue) -> bool # 使用自定義查找更改硬件伽瑪斜坡
pygame.display.set_palette(palette=None) # 設(shè)置顯示調(diào)色板
pygame.display.get_driver() -> str # 獲取 pygame 顯示后端的名稱
pygame.display.Info() -> VideoInfo # 創(chuàng)建視頻顯示信息對象
pygame.display.get_allow_screensaver() -> bool # 返回是否允許運(yùn)行屏保
pygame.display.set_allow_screensaver(bool) # 設(shè)置屏保是否可以運(yùn)行
pygame.display.gl_get_attribute(flag) -> value # 獲取當(dāng)前顯示的 OpenGL 標(biāo)志的值
pygame.display.gl_set_attribute(flag, value) # 請求顯示模式的 OpenGL 顯示屬性
2. 圖像: Surface
pygame.surface
模塊中主要有一個(gè) Surface
類型,并且導(dǎo)出到了 pygame
模塊中,可以直接使用 pygame.Surface
。
在 Pygame 中 Surface
用于表示具有固定的分辨率和像素格式的、內(nèi)存中的一張圖像。比如本地圖片加載到內(nèi)存中后就得到一個(gè) Surface
對象。
調(diào)用 pygame.display.set_mode()
函數(shù)初始化顯示窗口,返回的就是一個(gè) Surface
對象,稱為 “顯示圖像” (display Surface)。顯示圖像 是 Pygame 中單獨(dú)的一個(gè) Surface
,它包含在系統(tǒng)窗口中,如果是全屏模式則全屏運(yùn)行。顯示圖像(Surface
) 與 屏幕中系統(tǒng)窗口的內(nèi)容區(qū)域相對應(yīng),可以把游戲內(nèi)容繪制到 顯示圖像 中,然后通過調(diào)用 pygame.display.update()
或 pygame.display.flip()
函數(shù)把 顯示圖像 中的內(nèi)容更新到 屏幕上。
系統(tǒng)窗口 與 顯示圖像 的關(guān)系:
屏幕中的一個(gè)系統(tǒng)窗口,包括 窗口圖標(biāo)、窗口標(biāo)題、最小/最大化和關(guān)閉按鈕、窗口邊框、窗口內(nèi)容(還可以有菜單欄、工具欄、狀態(tài)欄等)。上圖中的紅色部分就是窗口的內(nèi)容區(qū)域,也就是 pygame.display.set_mode()
函數(shù)返回的 顯示圖像(Surface
) 對應(yīng)的區(qū)域。除了 窗口內(nèi)容 外,其他都是操作系統(tǒng)部分,不同操作系統(tǒng)、不同系統(tǒng)主題,顯示的效果可能不一樣。
除了 set_mode() 返回的 Surface,程序中可以調(diào)用它的構(gòu)造方法,任意創(chuàng)建 Surface 對象。也可以把本地圖片加載為 Surface,可以通過字體模塊把任意文本渲染為 Surface。然后把自己創(chuàng)建的 Surface 通過 blit()
方法繪制到 set_mode() 返回的 顯示圖像(Surface
) 中,再調(diào)用 update() 或 flip() 就能同步顯示在屏幕上了。
Surface
圖像坐標(biāo)系的原點(diǎn)在左上角,X 軸方向水平向右,Y 軸方向豎直向下:
pygame.Surface
類的主要方法:
# Surface 的構(gòu)造方法, 創(chuàng)建具有指定寬高的圖像, 默認(rèn)使用純黑色填充
# flags 附加標(biāo)志, 典型的標(biāo)志是: pygame.RLEACCEL, pygame.SRCALPHA (像素點(diǎn)包含alpha通道), pygame.SRCCOLORKEY
# depth 像素的顏色深度, 默認(rèn) Pygame 會(huì)使用最適合當(dāng)前系統(tǒng)的顏色深度。
pygame.Surface((width, height), flags=0, depth=0, masks=None) -> Surface
pygame.Surface((width, height), flags=0, Surface) -> Surface
# 獲取 Surface 的寬高尺寸
pygame.Surface.get_size() -> (width, height)
pygame.Surface.get_width() -> int
pygame.Surface.get_height() -> int
# 將 一個(gè)圖像(source) 繪制到 當(dāng)前圖像(self) 上, 繪制后超出當(dāng)前圖像部分將被忽略。
# dest 是一個(gè)坐標(biāo)二元組, 表示繪制的位置 (繪制后 source 的左上角在 self 上的坐標(biāo)位置)。
# dest 也可以是一個(gè) 四元祖(x, y, width, height) 或 Rect矩形區(qū)域, 如果是則只取 Rect.x 和 Rect.y 屬性作為繪制坐標(biāo)。
# 返回 繪制后 source 在 self 上的位置區(qū)域。
pygame.Surface.blit(source, dest, area=None, special_flags=0) -> Rect
# 將 多個(gè)圖像 繪制到 當(dāng)前圖像 上
pygame.Surface.blits(blit_sequence=((source, dest), ...), doreturn=1) -> [Rect, ...]
pygame.Surface.blits(((source, dest, area), ...)) -> [Rect, ...]
pygame.Surface.blits(((source, dest, area, special_flags), ...)) -> [Rect, ...]
# 用純色填充 Surface
pygame.Surface.fill(color, rect=None, special_flags=0) -> Rect
# 創(chuàng)建 Surface 的新副本
pygame.Surface.copy() -> Surface
# 更改圖像的像素格式(增加 alpha 通道), 包括每個(gè)像素的 alpha, 創(chuàng)建新副本
pygame.Surface.convert_alpha(Surface) -> Surface
pygame.Surface.convert_alpha() -> Surface
# 設(shè)置 Surface 圖像的整體 alpha 值。這里設(shè)置的 alpha 是與像素值無關(guān)的外置屬性, 不針對某個(gè)像素點(diǎn), 而是針對整體,
# 最終顯示為具體像素點(diǎn)的 alpha 值和整體 alpha 值的組合效果。就算沒有通過 convert_alpha() 轉(zhuǎn)換為帶 alpha 通道的圖像, 也可以設(shè)置整體 alpha 值。
pygame.Surface.set_alpha(value, flags=0)
pygame.Surface.set_alpha(None)
# 獲取當(dāng)前 Surface 圖像的整體 alpha 值
pygame.Surface.get_alpha() -> int
# 獲取單個(gè)像素的顏色值, 像素值無論是否有 alpha 通道, 均返回 (R, G, B, A)。如果沒有 alpha 通道, 則 A 固定為 255。
pygame.Surface.get_at((x, y)) -> Color
# 設(shè)置單個(gè)像素的顏色值, 可以以 "#RGBA" 或 (R, G, B, A) 的形式設(shè)置。如果參數(shù)格式中沒有 A, 則 A 默認(rèn)為 255。如果沒有 alpha 通道, 則 A 將被忽略。
pygame.Surface.set_at((x, y), Color)
# 創(chuàng)建一個(gè)引用其父級的新 Surface (獲取 Surface 的某個(gè)區(qū)域, 相當(dāng)于圖像裁剪)
# 返回的是原 Surface 的一個(gè)區(qū)域視圖, 不是副本 (如果需要副本, 可以再調(diào)用 copy() 方法), 因此在原圖像上的改變會(huì)反應(yīng)在返回的視圖上。
pygame.Surface.subsurface(Rect) -> Surface
pygame.Surface
類的其他方法:
pygame.Surface.convert(Surface=None) -> Surface # 更改圖像的像素格式, 創(chuàng)建新副本
pygame.Surface.convert(depth, flags=0) -> Surface
pygame.Surface.convert(masks, flags=0) -> Surface
pygame.Surface.lock() # 鎖定 Surface 內(nèi)存以進(jìn)行像素訪問
pygame.Surface.unlock() # 通過像素訪問解鎖 Surface 內(nèi)存
pygame.Surface.mustlock() -> bool # 判斷 Surface 是否需要鎖定
pygame.Surface.get_locked() -> bool # 判斷 Surface 當(dāng)前是否鎖定
pygame.Surface.get_locks() -> tuple # 獲取 Surface 的鎖
pygame.Surface.set_colorkey(Color, flags=0) # 設(shè)置透明色鍵
pygame.Surface.get_colorkey() -> RGB | None # 獲取當(dāng)前透明色鍵
pygame.Surface.get_at_mapped((x, y)) -> Color # 獲取單個(gè)像素的映射顏色值
pygame.Surface.get_palette() -> [RGB, RGB, RGB, ...] # 獲取 8 位 Surface 的顏色索引調(diào)色板
pygame.Surface.get_palette_at(index) -> RGB # 獲取調(diào)色板中單個(gè)條目的顏色
pygame.Surface.set_palette([RGB, RGB, RGB, ...]) # 為 8 位 Surface 設(shè)置調(diào)色板
pygame.Surface.set_palette_at(index, RGB) # 在 8 位 Surface 調(diào)色板中設(shè)置單個(gè)索引的顏色
pygame.Surface.map_rgb(Color) -> mapped_int # 將顏色轉(zhuǎn)換為映射顏色值
pygame.Surface.unmap_rgb(mapped_int) -> Color # 將映射的整數(shù)顏色值轉(zhuǎn)換為 Color
pygame.Surface.set_clip(rect|None) # 設(shè)置 Surface 的當(dāng)前裁剪區(qū)域
pygame.Surface.get_clip() -> Rect # 獲取 Surface 當(dāng)前的裁剪區(qū)域
pygame.Surface.scroll((dx=0, dy=0)) # 將圖像向右移動(dòng) dx 像素, 向下移動(dòng) dy 像素 (dx 和 dy 可以是負(fù)值)
pygame.Surface.get_parent() -> Surface # 找到子 Surface 的父級
pygame.Surface.get_abs_parent() -> Surface # 找到子 Surface 的頂級父級
pygame.Surface.get_offset() -> (x, y) # 找到父子 Surface 下子 Surface 的位置
pygame.Surface.get_abs_offset() -> (x, y) # 找到子 Surface 在其頂級父 Surface 內(nèi)的絕對位置
pygame.Surface.get_rect() -> Rect # 獲取 Surface 的矩形區(qū)域, 返回 Rect(0, 0, width, height)
pygame.Surface.get_bitsize() -> int # 獲取 Surface 像素格式的位深度
pygame.Surface.get_bytesize() -> int # 獲取 Surface 每個(gè)像素點(diǎn)使用的字節(jié)數(shù), RGB 格式的圖像為 3, RGBA 格式的圖像為 4
pygame.Surface.get_flags() -> int # 獲取用于 Surface 的附加標(biāo)志
pygame.Surface.get_pitch() -> int # 獲取每個(gè) Surface 行使用的字節(jié)數(shù), 等價(jià)于 width * get_bytesize()
pygame.Surface.get_masks() -> (R, G, B, A) # 在顏色和映射整數(shù)之間轉(zhuǎn)換所需的位掩碼
pygame.Surface.set_masks((R, G, B, A)) # 設(shè)置在顏色和映射整數(shù)之間轉(zhuǎn)換所需的位掩碼
pygame.Surface.get_shifts() -> (R, G, B, A) # 在顏色和映射整數(shù)之間轉(zhuǎn)換所需的位移位
pygame.Surface.set_shifts((R, G, B, A)) # 設(shè)置在顏色和映射整數(shù)之間轉(zhuǎn)換所需的位移位
pygame.Surface.get_losses() -> (R, G, B, A) # 用于在顏色和映射整數(shù)之間轉(zhuǎn)換的有效位
pygame.Surface.get_bounding_rect(min_alpha=1) -> Rect # 找到包含數(shù)據(jù)的最小矩形
pygame.Surface.get_view(<kind>="2") -> BufferProxy # 返回 Surface 像素的緩沖區(qū)視圖
pygame.Surface.get_buffer() -> BufferProxy # 為 Surface 的像素獲取緩沖區(qū)對象
pygame.Surface._pixels_address: int # (屬性) 像素緩沖區(qū)地址
pygame.Surface.premul_alpha() -> Surface # 返回 Surface 的副本, 其中 RGB 通道預(yù)乘以 alpha 通道
3. display 與 Surface 代碼示例
下面是兩個(gè)用于演示的示例圖片:
把上面兩個(gè)圖片保存到本地,放在與 py 源碼文件相同目錄下,并命名為 duck.png
和 floor.png
。
display 與 surface 代碼示例:
import pygame
def main():
# 初始化 pygame
pygame.init()
# 設(shè)置系統(tǒng)窗口標(biāo)題
pygame.display.set_caption("display 與 Surface")
# 加載本地圖片 (圖片文件 與 當(dāng)前py文件 在相同路徑), 返回的是 Surface 對象
duck_img = pygame.image.load("duck.png")
print(type(duck_img), duck_img)
# Output: <class 'pygame.surface.Surface'> <Surface(80x80x32 SW)>
# 其中 80x80x32 表示 duck_img 的寬高為 80x80, 顏色模式為 32 位顏色
# 設(shè)置系統(tǒng)窗口圖標(biāo), 把一個(gè) Surface 圖像設(shè)置為系統(tǒng)窗口圖標(biāo)
pygame.display.set_icon(duck_img)
# 初始化顯示窗口, 返回一個(gè)與窗口內(nèi)容區(qū)域綁定的 Surface 對象 (顯示圖像)
# 因?yàn)榇?Surface 與屏幕窗口關(guān)聯(lián), 所以一般命名為 screen 或 display_surface
screen = pygame.display.set_mode((400, 300))
print(type(screen), screen) # Output: <class 'pygame.surface.Surface'> <Surface(400x300x32 SW)>
# 加載本地圖片
floor_img = pygame.image.load("floor.png")
# 裁剪圖像, 創(chuàng)建 floor_img 左上角 100x100 的矩形視圖區(qū)域, 返回的是 Surface 對象
sub_img = floor_img.subsurface((0, 0, 100, 100))
print(type(sub_img), sub_img) # Output: <class 'pygame.surface.Surface'> <Surface(100x100x32 SW)>
# 游戲主循環(huán)
while True:
# QUIT 退出事件判斷
for event in pygame.event.get():
if event.type == pygame.QUIT:
# 退出 pygame
pygame.quit()
return
# 先填充背景顏色
screen.fill("#CCCCCC")
# 把 duck_img 繪制到 screen 圖像中, 繪制后 duck_img 的左上角在 screen 的 (50, 50) 坐標(biāo)位置
screen.blit(duck_img, (50, 50))
# 把 floor_img 繪制到 screen 圖像的底部中間
screen.blit(floor_img, (screen.get_width() / 2 - floor_img.get_width() / 2, screen.get_height() - floor_img.get_height()))
# 把 sub_img 繪制到 screen 的 (230, 30) 位置
screen.blit(sub_img, (230, 30))
# 把 screen 圖形中的內(nèi)容更新到屏幕窗口
pygame.display.flip()
if __name__ == "__main__":
main()
pygame.image.load()
函數(shù)加載圖片,傳遞的參數(shù)是圖片文件的本地路徑。在任意編程語言中,路徑可以使用 相對路徑 或 絕對路徑 表示,例如duck.png
和image/duck.png
都是一個(gè)相對路徑,D:\image\duck.png
或/image/duck.png
是一個(gè)絕對路徑。相對路徑相對于程序當(dāng)前的工作目錄,Python 中可以調(diào)用os.getcwd()
獲取當(dāng)前工作路徑。如果初學(xué)者搞不清楚相對路徑或提示文件找不到,可以先直接使用絕對路徑,例如:r"D:\image\duck.png"
或"D:/image/duck.png"
。
在源碼文件所在路徑,運(yùn)行代碼:文章來源:http://www.zghlxwxcb.cn/news/detail-721516.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-721516.html
到了這里,關(guān)于Pygame 基礎(chǔ)教程02: 顯示窗口(display) 與 圖像(Surface)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!