轉載注明鏈接:https://www.cnblogs.com/liquancai/p/13232469.html
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 是一個頂點座標的陣列,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/100318.html
標籤:Python
上一篇:求助大佬(map)
