pygame 圖像 / 圖形繪製 1. pygame 的圖像繪製 pygame 支持多種存儲圖像的方式(也就是圖片格式),例如 JPEG、PNG 等,具體支持 JPEG (一般擴展名為 .jpg 或者 .jpeg ,數位相機、網上的圖片基本上都是這種格式,這是一種有損壓縮方式,儘管對圖片的質量有所損 ...
pygame 圖像 / 圖形繪製
1. pygame 的圖像繪製
pygame 支持多種存儲圖像的方式(也就是圖片格式),例如 JPEG、PNG 等,具體支持 JPEG (一般擴展名為 .jpg 或者 .jpeg ,數位相機、網上的圖片基本上都是這種格式,這是一種有損壓縮方式,儘管對圖片的質量有所損壞,但對於減小文件尺寸很有幫助,其優點很多,只是不支持透明)、PNG(支持透明,無損壓縮)、GIF(網上使用得很多,支持透明和動畫,但只能有 256 種顏色,在軟體和游戲中的使用很少)以及 BMP、PCX、TGA、TIF 等格式。
pygame 使用 surface 對象來載入繪製的圖像。對於 pygame ,載入圖片使用 pygame.image.load(), 給它一個文件名然後返回一個 surface 對象。儘管載入的圖像格式不同,但 surface 對象隱藏了這些不同。用戶可以對一個 surface 對象進行塗畫、變形、複製等各種操作。事實上游戲屏幕也只是一個 surface, pygame.display.set_mode()
返回了一個 surface 對象。
對於任何一個 surface 對象,可以用 get_width() 、get_height() 和 get_size() 函數來獲取它的尺寸,get_rect() 用來獲取它的區域形狀。
例:使用 pygame 開發一個顯示坦克自由移動的游戲視窗
import pygame
def tank():
pygame.init()
tank_image = pygame.image.load("tank.png")
tank_rect = tank_image.get_rect()
screen = pygame.display.set_mode((400, 600))
pygame.dispaly.set_caption("自由移動的tank")
screen_rect = screen.get_rect()
color_back = (255, 255, 255)
tank_speed = [1, 1]
fps_clock = pygame.time.Clock()
while True:
fps_clock.tick(60)
for event in pygame.event.get():
if evnet.type == pygame.QUIT:
pygame.quit()
exit()
tank_rect = tank_rect.move(tank_speed)
if tank_rect.left < 0 or tank_rect.right > screen_rect.right:
tank_speed[0] = -tank_speed[0]
if tank_rect.top < 0 or tank_rect.bottom > screen_rect.bottom:
tank_speed[1] = tank_speed[1]
screen.fill(color_back)
screen.blit(tank_image, tank_rect)
pygame.display.update()
if __name__ == '__main__':
tank()
程式運行後,可以看到白色背景的游戲視窗,標題是“自由移動的 tank ”,如下圖所示:
在該游戲中通過修改塔克圖像( surface 對象)區域的 left 屬性(可以認為是 x 座標)、 surface 對象的 top 屬性(可以認為是 y 屬性)改變坦克位置,從而顯示出坦克自由移動的效果。在視窗(視窗也是 surface 對象)使用的 blit()
函數上繪製坦克圖像,最後註意需要更新視窗顯示內容。
設置 fps_clock 變數的值即可控制創建刷新速度,語法如下:
fps_clock = pygame.time.Clock()
在無限迴圈中寫入 fps_clock.tick(60)
,可以按指定幀頻 60 更新游戲畫面(即每秒刷新 60 次屏幕)。
2.pygame 的圖形繪製
在屏幕上繪製各種圖形時使用 pygame.draw 模塊中的一些函數,事實上,pygame 可以不載入任何圖片,而使用圖形來製作一個游戲。
pygame.draw 中的函數的第 1 個參數總是一個 sueface , 然後是顏色,接著是一系列的座標等。對於電腦中的座標,(0,0)代表左上角,水平向右為 X 軸的正方向,垂直向下為 Y 軸的正方向。該函數的返回值是一個 rect 對象,包含了繪製的區域,這樣就可以很方便的更新那一部分了。pygame.draw 中的函數如下表所示:
函數 | 作用 | 函數 | 作用 |
---|---|---|---|
rect() | 繪製矩形 | line() | 繪製線 |
polygon() | 繪製多邊形(3個及3個以上的邊) | lines() | 繪製一系列的線 |
circle() | 繪製圓 | aaline() | 繪製一根平滑的線 |
ellipse() | 繪製橢圓 | aalines() | 繪製一系列平滑的線 |
arc() | 繪製圓弧 |
下麵詳細說明 pygame.draw 中各個函數的使用。
-
pygame.draw.rect()
格式:pygame.draw.rect(surface, color, rect, width=0)
pygame.draw.rect() 在 surface 上畫一個矩形,除了 surface 和 color 以外,rect 接收一個矩形的座標和線寬參數,如果線寬是 0 或省略,則填充。
-
pygame.draw.polygon()
格式:pygame.draw.polygon(surface, color, pointlist, width=0)
polygon() 用於畫多邊形,其用法類似於 rect(), 與 rect() 第1、第2、第 4 個參數都是相同的,只不過 polygon()會接收一系列座標的列表,代表了各個頂點的座標。
-
pygame.draw.circle()
格式:pygame.draw.circle(surface, color, pos, radius, width=0)
circle() 用於畫一個圓,它接收一個圓心座標和一個半徑參數。
-
pygame.draw.ellipse()
格式:pygame.draw.ellipse(surface, color, rect, width=0)
用戶可以把 ellipse 想象成一個被壓扁的圓,事實上,它可以被一個矩形裝起來。ellipse() 的第 3 個參數就是這個橢圓的外接矩形。
-
pygame.draw.arc()
格式:pygame.draw.arc(surface, color, rect, start_angle, stop_angle, width=1)
arc() 是橢圓的一部分,所以它的參數比橢圓多一些。但它不是封閉的,因此沒有
fill()
方法,start_angle 和 stop_angle 為開始和結束的角度。 -
pygame.draw.line()
格式:pygame.draw.line(surface, color, start_pos, end_pos, width=1)
line() 用於畫一條線段,start_pos 和 end_pos 是線段的起點和結點座標。
-
pygame.draw.lines()
格式:pygame.draw.lines(surface, color, closed, pointlist, width=1)
closed 是一個布爾變數,指明是否需要多畫一條線來使這些線條閉合(這樣就和 polygon() 一樣了),pointlist 是一個頂點座標的數組。