pygame圖形接口
使用pygame.image模塊,可以對圖像進行讀取和保存。
使用pygame.image.load讀取圖像文件。
img = pygame.image.load(filename)
可 以讀取文件名為filename的圖像文件,pygame會自動確定文件的類型(比如GIF或者BMP),一般來說支持JPG、PNG、GIF (non animated)、BMP、PCX、TGA (uncompressed)、TIF、LBM (及PBM)、PBM (及PGM, PPM)、XPM等。它返回一個包含圖像的Surface,Surface的格式和原來的文件相同(包括顏色格式、透明色和alpha透明)。
使用pygame.image.save可以把圖像保存到文件中。
pygame.image.save(img, filename)
這個函數可以把img這個Surface的內容保存為filename指定的圖像文件,文件格式可以是BMP、TGA、PNG或者JPEG。如果文件擴展名不認識,默認保存為TGA格式。TGA和BMP格式都是非壓縮的文件。
還有pygame.image.tostring、pygame.image.fromstring、pygame.image.frombuffer函數可以把圖像序列化,即把圖像保存在字符串中或者從字符串中讀取圖像。
變換
使用pygame.transform模塊中的函數,可以對圖像進行簡單的變換。所有的這些函數都需要一個Surface參數指明要處理的圖像,并生成一個新的圖像表示處理后的結果,原來的圖像不會被改變。
使用pygame.transform.flip可以上下左右顛倒圖像,比如
newimg = pygame.transform.flip(img, True, False)
第一個參數指定要翻轉的圖像,第二個參數指定是否對圖像進行左右顛倒,第三個參數指定是否對圖像進行上下顛倒。函數返回顛倒后的圖像。
使用pygame.transform.scale可以對圖像進行縮放,比如
newimg = pygame.transform.resize(img, (640, 480))
第一個參數指定要縮放的圖像,第二個參數指定縮放后的圖像大小,函數返回縮放后的圖像。
使用pygame.transform.rotate可以對圖像進行旋轉,比如
newimg = pygame.transform.rotate(img, 30.0)
第一個參數指定要旋轉的圖像,第二個參數指定旋轉的角度數,正值為逆時針旋轉,負值是順時針旋轉。函數返回旋轉后的圖像。旋轉后的圖像可能比原來的圖像大,才能夠容納原來的整個圖像,空出來的部分會補上透明色或者原來圖像的左上角點的顏色。
使用pygame.transform.rotozoom可以對圖像進行縮放并旋轉,比如
newimg = pygame.transform.rotozoom(img, 30.0, 2.0)
第一個參數指定要處理的圖像,第二個參數指定旋轉的角度數,第三個參數指定縮放的比例。返回處理后的圖像。這個函數和前面兩個函數不一樣,這個函數會對圖像進行濾波處理,圖像效果會更好,但是速度會慢很多。
使用pygame.transform.scale2x可以對圖像進行快速的兩倍大小的放大,比如
newimg = pygame.transform.scale2x(img)
使用pygame.transform.chop可以對圖像進行裁減,比如
newimg = pygame.transform.chop(img, (100, 100, 200, 200))
第一個參數指定要裁減的圖像,第二個參數指定要保留的圖像的區域。返回裁減后留下的圖像。
對surface的控制
像素格式
pygame里的Surface是用來表示圖像的對象。Surface有一定的大小和像素格式。在創建的時候,可以指定。
pygame.Surface((width, height), flags=0, depth=0, masks=None): return Surfacepygame.Surface((width, height), flags=0, Surface): return Surface
如果是8bit像素格式的Surface,它還會用一個調色板映射到24比特顏色。像素格式可以通過指定像素深度或者已有的Surface來控制。flags標志位參數是其他一些Surface選項的集合,你可以指定如下的標志
HWSURFACE, 在視頻內存中創建圖像 SRCALPHA, 像素格式中會包含一個alpha通道這些參數都僅僅是一個請求,在實際中可能并不能實現。高級用戶可以組合一組顏色屏蔽位,masks是4個整數的集合,表示像素里的哪個位用來表示一種顏色。一般的Surface不需要masks參數。
8bit的Surface有一個調色板,把8bit的整數映射到RGB彩色。通過下面函數可以對調色板進行設置:
Surface.set_at(index, RGB): return NoneSurface.set_palette([RGB, RGB, RGB, ...]): return None
通過下面的函數可以獲得當前的調色板:
Surface.get_palette(): return [RGB, RGB, RGB, ...]Surface.get_palette_at(index): return RGB
不同像素類型的Surface之間的blit操作是很慢的,所以一般在blit之前要先通過Surface.convert對圖像進行像素格式的變換。Surface.convert有多種不同的用法
Surface.convert(Surface): return SurfaceSurface.convert(depth, flags=0): return SurfaceSurface.convert(masks, flags=0): return SurfaceSurface.convert(): return Surface
新的像素格式可以由現存其它Surface確定,也可以由depth,flags或者masks決定。這些參數和pygame.Surface的參數類似。
如果沒有參數,新的Surface會和display Surface的像素格式一樣。這是畫圖最快的格式。轉換所有需要多次blit的Surface是一個好主意。
轉換出來的Surface不會有像素alpha。如果原來的Surface里面有,他們會被去掉。參看Surface.convert_alpha來保留或者創建每像素alpha。
如果Surface是有alpha通道的,并且需要保留這個信息,則需要使用Surface.convert_alpha:
Surface.convert_alpha(Surface): return SurfaceSurface.convert_alpha(): return Surface
塊復制
一個圖像復制到另一個上面,這是游戲中最常用的操作,由blit函數來實現
Surface.blit(source, dest, area=None, special_flags = 0): return Rect
畫的位置可以由dest參數指定。dest可以是一對坐標值,表示源Surface的左上角在這個Surface上的坐標。dest也可以是一個矩形,矩形的左上角作為blit的位置,而矩形的大小不影響blit。
有一個可選的area矩形參數,可以用來指定只畫源Surface的一部分。
一個可選的special_flags參數,可以是BLEND_ADD、BLEND_SUB、BLEND_MULT、BLEND_MIN、BLEND_MAX。將來也可能有其它特殊標記添加進來。
函數返回的矩形表示受影響的像素的區域,不包括目標Surface以外的像素,也不包括剪切區域以外的像素。
透明
pygame支持三種類型 的透明:透明色(colorkey),Surface alpha和每像素alpha。Surface alpha可以和透明色(colorkey)混合使用,但是有像素alpha的圖像不能夠使用其它模式。透明色(colorkey)讓一種顏色值透明。任 何和這個顏色相同的像素都不會被畫出來。Surface alpha值是單獨一個值用來改變整個圖像的透明度。Surface alpha值是255表示不透明,值是0表示全透明。而每像素alpha是不一樣的,它為每個像素保存了一個透明值。這種方法允許精確的控制透明效果,但 是這種方法也是最慢的。每像素alpha不能和其它方法混用。
要設置透明色,使用Surface.set_colorkey函數:
Surface.set_colorkey(Color, flags=0): return NoneSurface.set_colorkey(None): return None
當 把這個Surface blit到令一個Surface時候,和這個透明色顏色相同的像素會變成透明。color參數可以是RGB顏色或者是一個映射的整數。如果傳送的是 None,則Surface會沒有透明色。如果是有每像素透明的Surface,透明色會被忽略。透明色可以和Surface alpha混合使用。可選的flags參數可以是pygame.RLEACCEL,用來在沒有加速的時候提供更好的性能。設置了RLEACCEL的 Surface作為源Surface blit更快,但是修改Surface的內容會更慢。
Surface的當前透明色可以通過Surface.get_colorkey獲得:
Surface.get_colorkey(): return RGB or None
如果沒有透明色,則函數返回None。
要設置Surface的alpha值,可以通過Surface.set_alpha來實現:
Surface.set_alpha(value, flags=0): return NoneSurface.set_alpha(None): return None
透明值value可以取0到255之間的值,0是完全透明,255是完全不透明。如果value是None,則Surface就沒有alpha透明了。
Surface當前的alpha值可以通過Surface.get_alpha獲得:
Surface.get_alpha(): return int_value or None
如果沒有alpha透明,則這個函數返回None。
每像素在繪圖的時侯可以通過顏色元組的第四個參數指定。
剪切區域
每個Surface包含一個剪切區域。默認情況下,剪切區域是整個Surface。如果改變了剪切區域,所有的畫圖操作都會限制在一個比較小的范圍之內。
通過Surface.set_clip可以設置剪切區域:
Surface.set_clip(rect): return NoneSurface.set_clip(None): return None
如果參數是None,則整個Surface都可以修改。剪切區域總是在Surface本身的區域只內的。如果剪切區域比Surface的區域大,則會自動縮小到Surface區域之內。
要獲得Surface的當前剪切區域,可以通過Surface.get_clip:
Surface.get_clip(): return Rect
一個Surface總是返回一個有效的矩形,不會超過圖像的邊界范圍。如果Surface設置了None作為剪切區域,則Surface會返回整個Surface的區域。
鎖定
對于硬件加速的Surface,它有可能被存在顯示內存中。要訪問這些Surface上面的像素,就必須先通過Surface.lock對像素進行鎖定:
Surface.lock(): return None
鎖定完后,可以對Surface上的像素進行操作,操作完成后,應該及時解鎖:
Surface.unlock(): return None
一個Surface是否要先鎖定再操作,可以通過Surface.mustlock來判斷:
Surface.mustlock(): return bool
這個函數返回Ture則需要鎖定,否則不需要鎖定。一個Surface當前的鎖定狀態可以通過Surface.get_locked來獲得:
Surface.get_locked(): return bool
這個函數返回True表示已經鎖定了,False表示沒有鎖定。
實 際上,pygame中所有需要鎖定Surface才能操作的函數都會自動地對Surface鎖定和解鎖。一般情況下不需要調用lock和unlock函 數。但是如果在一段代碼中需要反復對Surface上的像素進行操作,則每次都進行鎖定和解鎖會非常的慢,所以可以在這一串操作開始的時候進行鎖定,這一 串操作結束后解鎖,避免重復的鎖定解鎖操作。
繪圖
除了可以把事先畫好的圖片blit到Surface上以外,還可以在Surface上自行在Surface上繪制一些簡單的圖形,比如點、線、方、圓等。這個功能主要由pygame.draw模塊完成。
首先導入pygame.draw模塊。
import pygame.draw
如果已經用了import pygame,則pygame.draw模塊也被自動導入了。
然后準備好要在上面繪制圖形的Surface,比如
surface = pygame.display.set_mode((640, 480))
畫矩形
接下來就可以在surface上面繪制想要的圖形了。比如說畫矩形可以使用pygame.draw.rect函數:
pygame.draw.rect(surface, (0,0,255), (100, 200, 100, 100))
第一個參數指定在哪個Surface上畫矩形,第二個參數是矩形的顏色,第三個參數是矩形的位置和大小。
顏 色的參數一般是一個由紅綠藍三種顏色值構成的三元組,0是最暗的,255是最亮的。比如(0,0,255)是純藍色,(255,0,0)是純紅色, (0,0,0)是黑色,(255,255,255)是白色等等。有時候也可以使用RGBA四元組來表示顏色。如果Surface包含alpha,四元組中 alpha值會被直接寫入到Surface里面,畫圖函數并不會進行透明的繪畫。顏色參數也可以是一個整數,是映射到Surface里的像素值。其他繪圖 函數里面的顏色參數也是一樣的。
矩形參數由四個值構成的元組,分別是矩形左上角的x、y坐標,矩形的寬和高。
默認情況下,畫出來的矩形是實心的(中間填充了指定的顏色)。如果要畫一個只有邊框的矩形,可以指定一個可選的參數width。比如
pygame.draw.rect(surface, (0,0,255), (100, 200, 100, 100), 2)
可以在屏幕上畫一個邊框是2個像素粗的矩形,中間是透明的。如果不指定這個width參數,或者width指定為0,則畫出來的矩形就是實心的。其他有些繪圖函數里面也有類似的參數,功能也是相似的。
pygame.draw.rect函數返回一個矩形,表示屏幕上被修改的像素的區域范圍。其它繪圖函數也都有這樣的返回值。
畫多邊形
用pygame.draw.polygon可以在Surface上畫一個多邊形。比如
pygame.draw.polygon(surface, (255,0,0), [(100, 100),(200, 100),(250,186.6),(200,273.2),(100, 273.2),(50,186.6)])
第三個參數pointlist參數是多邊形頂點的列表??蛇x的第四個width參數是多邊形的邊的粗細。如果width是0或者被忽略,多邊形是被填充的。
pygame.draw.polygon(surface, (0,255,0), [(100, 100),(200, 100),(250,186.6),(200,273.2),(100, 273.2),(50,186.6)],1)
畫圓
pygame.draw.circle在Surface上畫一個圓形。
pygame.draw.circle(surface, (255,255,0), (100, 100), 50)
第三個參數pos是圓的圓心,第四個參數radius是半徑大小??蛇x的第五個參數width是圓邊的粗細,如果width缺省或者是0圓會被填充。
畫橢圓
pygame.draw.ellipse在矩形區域中畫一個橢圓的形狀。比如
pygame.draw.ellipse(surface, (0,255,255), (200, 200, 200, 100))
第三個參數指定的矩形區域是橢圓填充的區域??蛇x的第四個參數width是邊的粗細。如果width缺省或者是0,橢圓會被填充。
畫弧線
pygame.draw.arc畫橢圓的一段。比如
pygame.draw.arc(surface, (0,255,0), (200, 200, 200, 100), 3.14159/3, 3.14159*2/3)
在Surface上畫一個橢圓狀的弧線。第三個參數rect指定橢圓填充的矩形。接下來兩個角度參數指定起始和終止的角度(以弧度為單位),朝右為0度??蛇x的第六個參數width是弧線的粗細,默認值是1。
== 畫線段 ==?
pygame.draw.line函數可以畫一條直線段。比如
pygame.draw.line(surface, (255,0,255), (100, 100), (200, 200))
第三個參數指定起點,第四個參數指定終點。可選的第五個參數width指定線的寬度,默認是1。線段終點沒有箭頭,寬的線段終點是方形的。
畫連續的線段
pygame.draw.lines畫多條連續的線段。比如
pygame.draw.lines(surface, (255,255,255), False, [(100, 100), (200, 200), (300, 200), (200, 100)])
第四個參數pointlist是一系列點的列表。如果第三個參數是True,則在最后一點和第一點之間會畫一條線段??蛇x的第五個參數表示線的寬度,默認為1。這個函數不會畫終點箭頭和中間連接頭。線段有尖銳的拐角,粗的線段會有不太好看的拐角。
抗鋸齒的線段
pygame.draw.aaline畫抗鋸齒的線段。
pygame.draw.aaline(surface, (255,255,0), (200, 100), (300, 200))
這個函數的用法和畫線段的函數差不多,只是畫出來的線段有抗鋸齒效果,看上去比較光滑。有一個可選的第五個參數blend,如果blend是True,則陰影部分是和原始像素混合而不是直接覆蓋的。這個函數接受浮點數作為點的坐標。
pygame.draw.aalines可以畫多條連續的抗鋸齒線段。
pygame.draw.aalines(surface, (0,0, 255), False, [(100, 100), (200, 200), (300, 100), (200, 0)])
如果第三個參數如果是True,則在第一個點和最后一點之間會畫一條直線。有一個可選的第五個參數blend,如果blend參數是True,則陰影部分是和原始像素混合而不是直接覆蓋的。這個函數接受浮點數作為點的坐標。
點操作
畫點的方法和其它方法不太一樣,用Surface.set_at方法完成畫點的操作,比如:
surface.set_at((100, 100), (255,255,255))
第一個參數是點的坐標,第二個參數是顏色。在游戲和實時模擬中,一次取得和設置一個像素是很慢的。
除了可以在Surface上畫點,還可以用Surface.get_at讀取Surface上像素的值。比如
color = surface.get_at((100, 100))
這個函數返回給定點的顏色值。
填充區域
Surface.fill方法可以用一種顏色填充一個矩形區域。比如
surface.fill((255,0,0), (100, 200, 100, 100))
第一個參數指定要填充的顏色,第二個參數指定填充的矩形區域。如果沒有給定第二個參數,整個Surface會被填充。第二個參數會限制備填充的區域。這個函數會返回受影響的Surface區域。
寫字
相對于在Surface上畫圖,在Surface上寫文字要復雜得多。
首先需要導入pygame.font模塊并初始化。
import pygame.fontpygame.font.init()
選擇字體
然后用pygame.font.get_fonts獲取可用的字體的列表。
pygame.font.get_fonts()
它返回一個字體名字的列表。
然后再用字體名字列表中的一個名字可以創建一個字體對象。
font = pygame.font.SysFont("monospace", 12)
第一個參數指定字體的名字,第二個參數指定字體的大小??蛇x的第三個參數bold指定是否粗體,默認不是粗題??蛇x的地四個參數italic指定是否斜體,默認不是斜體。
如果是要使用自己給的字體文件,可以這樣創建字體對象
font = pygame.font.Font("/usr/share/fonts/truetype/arphic/uming.ttf", 12)
第一個參數指定要載入的字體文件的完整路徑,第二個參數指定字體的大小。
創建文字Surface
使用字體對象的Font.render函數可以創建一個Surface,里面包含寫出來的文字。比如
font_surface = font.render("Hello world!", False, (255,0,0))
第 一個參數是要寫的文字,文字只能包含一行,換行符不會被畫出來。第二個參數指定是否使用抗鋸齒效果,如果是True字符會有光滑的邊緣。第三個參數是字體 的顏色。可選的第四個參數background用來指定文字背景的顏色。如果沒有指定background,背景是透明的。返回創建的Surface,它 上面包含了畫出來的文字,它的大小是能容納這些字的最小的大小。
要在已有的Surface上寫字,只能先創建一個只包含文字的Surface,然后把它blit到已有的Surface上。比如:
surface.blit(font_surface, (100, 100))