標籤:
接著上次的繼續。
簡單的畫圖函數
Pygame給我們提供了幾個簡單的畫圖函數,比如畫矩形,圓,橢圓,線,獨立的像素點。
下面這個程式就實現了一些簡單畫圖的操作
import pygame, sysfrom pygame.locals import *pygame.init()DISPLAYSURF = pygame.display.set_mode((500,400),0,32)BLACK = (0, 0 , 0)WHITE = (255, 255, 255)RED = (255, 0, 0)GREEN = (0, 255, 0)BLUE = (0, 0, 255)DISPLAYSURF.fill(WHITE)pygame.draw.polygon(DISPLAYSURF, GREEN, ((146,0),(291,106),(236,277),(56,277),(0,106)))pygame.draw.line(DISPLAYSURF, BLUE, (60, 60), (120,60), 4)pygame.draw.line(DISPLAYSURF, BLUE, (20, 60), (60,20))pygame.draw.line(DISPLAYSURF, BLUE, (60, 120), (120,120), 4)pygame.draw.circle(DISPLAYSURF,BLUE, (300,50), 20, 0)pygame.draw.ellipse(DISPLAYSURF,RED,(300,250,40,80),1)pygame.draw.rect(DISPLAYSURF,RED,(200,150,100,50))pixObj = pygame.PixelArray(DISPLAYSURF)pixObj[480][380] = BLACKpixObj[482][382] = BLACKpixObj[484][384] = BLACKpixObj[486][386] = BLACKpixObj[488][388] = BLACKdel pixObjwhile True: for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() pygame.display.update()
執行後的效果
這裡面有多一些新的Pygame的東西
fill(color)是Surface對象的一種方法,將surface對象的視窗全部填充一種顏色,就是背景色。
pygame.draw.polygon(surface, color, pointlist, width)畫個多邊形,其中surface和color參數告訴畫在哪個對象裡和使用的顏色,pointlist參數是由多個點構成的元組或列表,然後就會從第一個點開始,依次串連後面的點從而構成多邊形,width參數是可選的,如果沒有,則多邊形會被color參數的顏色填充,如果有,而不會填充,多邊形輪廓寬度就由width參數決定。傳遞0給width參數跟沒有width參數是一樣的。
需要注意的是,所有pygame.draw畫圖函數都有一個選擇項參數width在最後,它們和pygame.draw,polygon函數中的width參數工作方式相同。
pygame.draw.line(surface, color, start_point, end_point, width) 畫線函數
pygame.draw.lines(surface, color, closed, pointlist, width) 畫多個相連的線,從起點到終點,與pygame.draw.polygon類似,唯一不同的是,如果closed參數為False,終點不會與起點相串連,傳遞True的話,終點會與起點想串連。
pygame.draw.circle(surface, color, center_point, radius, width) 畫圓
pygame.draw.ellipse(surface, color, bounding_rectange, width) 畫橢圓
pygame.draw.rect(surface, color, rectangle_tuple, width) 畫矩形
pygame,PixelArray對象
pygame沒有單獨的畫點函數。而方法就是建立pygame.PixelArray對象然後設定獨立的像素點。建立一個關於Surface的PixelArray對象會‘鎖住’Surface對象。一旦Surface對象被鎖住,畫圖函數仍然可以使用,但是類似PNG或JPG的圖片就不能作用在Surface對象上了,如果你想查看一個Surface對象是否鎖住了,可以調用Surface對象get_locked()方法,如果鎖住了會返回True,反之False。
設定這些獨立像素點的方法是用兩個索引值訪問,比如pixObj[480][380] = BLACK ,這樣就會將X座標值的480和Y座標的380這兩個點設為黑色。
為了告訴pygame你完成了畫完獨立像素點,你需要通過一個del語句刪除PixArray對象。刪除PixArray對象會‘解鎖’Surface對象,那樣你就可以繼續在上面載入圖片了。如果忘了刪除,則下次你想在Surface對象上載入圖片的話就會報錯。
pygame.display.update()函數
當你完成所有畫圖函數後,你必須調用pygame.display.update()函數讓起顯示在顯示器上。
需要記住的一點是pygame.display.update()函數只會讓顯示對象(即通過調用pygame.display.set_mode()返回的對象)顯示在螢幕上。如果你想讓圖片顯示在螢幕上,你必須“blit”它們(複製它們的意思)到顯示對象上通過blit()方法。
Animation
讓映像動起來其實很簡單,就是將映像從一個地方移動到另一個地方,就是清除掉映像原來所在地方的映像,然後在另一個地方載入這個映像,這樣看上去映像就像動起來了一樣。在電腦看來,其實就是一群像素的移動。就是一個例子
下面是一段範例程式碼
import pygame, sysfrom pygame.locals import *pygame.init()FPS = 30 # frames per second settingfpsClock = pygame.time.Clock()# set up the windowDISPLAYSURF = pygame.display.set_mode((400, 300), 0, 32)pygame.display.set_caption(‘Animation‘)WHITE = (255, 255, 255)catImg = pygame.image.load(‘cat.png‘)catx = 10caty = 10direction = ‘right‘while True: # the main game loop DISPLAYSURF.fill(WHITE) if direction == ‘right‘: catx += 5 if catx == 280: direction = ‘down‘ elif direction == ‘down‘: caty += 5 if caty == 220: direction = ‘left‘ elif direction == ‘left‘: catx -= 5 if catx == 10: direction = ‘up‘ elif direction == ‘up‘: caty -= 5 if caty == 10: direction = ‘right‘ DISPLAYSURF.blit(catImg, (catx, caty)) for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() pygame.display.update() fpsClock.tick(FPS)
其中cat.png的PDF上面已經給出了。下載後必須與源檔案放在一個檔案夾裡面。執行效果就是一隻貓兒在一個視窗裡面移動。先右,再下,再左,再上,如此迴圈。
上面這段代碼裡面又出現了一些新的東西。
幀率和pygame.time.Clock對象
幀率與重新整理率指的是程式一秒鐘能顯示圖片的數目,用FPS和幀每秒來表示。(在其它電腦顯示器上,FPS有個福士名字叫做赫茲,許多顯示器都有60赫茲的畫面播放速率,或者叫做每秒60幀)低的幀率出現在一些映像遊戲裡就會導致遊戲看起來是跳躍和抖動的,如果程式有太多的代碼而經常重新整理螢幕的話,就會導致FPS下降。但是在這本書裡面的遊戲因為足夠簡單所以即使在一些老的電腦上也不會出現問題。
pygame.time.Clock對象能夠協助我們確認程式能跑到的一個最大的確定的FPS值。Clock對象將在遊戲主迴圈中插入小小的暫停以確保我們的遊戲程式不會跑的太快。如果我們沒有這些暫停話,我們的遊戲就會跑得跟電腦一樣快。對玩遊戲的人來說它確實太快了。在遊戲迴圈中調用Clock對象的tick()方法能保證我們的遊戲跑到一個確定的速度不管電腦跑得有多麼快。建立Clock對象如下語句
fpsClock = pygame.time.Clock()
tick方法應該在遊戲迴圈的最末尾調用,也就是在pygame.display.update之後,調用語句如下
fpsClock.tick(FPS)
Make Games with Python & Pygame (2)