Make Games with Python Pygame (2)
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
接著上次的繼續(xù)。
?
簡(jiǎn)單的畫圖函數(shù)
Pygame給我們提供了幾個(gè)簡(jiǎn)單的畫圖函數(shù),比如畫矩形,圓,橢圓,線,獨(dú)立的像素點(diǎn)。
下面這個(gè)程序就實(shí)現(xiàn)了一些簡(jiǎn)單畫圖的操作
import pygame, sys from 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] = BLACK pixObj[482][382] = BLACK pixObj[484][384] = BLACK pixObj[486][386] = BLACK pixObj[488][388] = BLACKdel pixObjwhile True:for event in pygame.event.get():if event.type == QUIT:pygame.quit()sys.exit()pygame.display.update()執(zhí)行后的效果如圖
這里面有多一些新的Pygame的東西
fill(color)是Surface對(duì)象的一種方法,將surface對(duì)象的窗口全部填充一種顏色,就是背景色。
pygame.draw.polygon(surface, color, pointlist, width)畫個(gè)多邊形,其中surface和color參數(shù)告訴畫在哪個(gè)對(duì)象里和使用的顏色,pointlist參數(shù)是由多個(gè)點(diǎn)構(gòu)成的元組或列表,然后就會(huì)從第一個(gè)點(diǎn)開始,依次連接后面的點(diǎn)從而構(gòu)成多邊形,width參數(shù)是可選的,如果沒有,則多邊形會(huì)被color參數(shù)的顏色填充,如果有,而不會(huì)填充,多邊形輪廓寬度就由width參數(shù)決定。傳遞0給width參數(shù)跟沒有width參數(shù)是一樣的。
需要注意的是,所有pygame.draw畫圖函數(shù)都有一個(gè)選擇項(xiàng)參數(shù)width在最后,它們和pygame.draw,polygon函數(shù)中的width參數(shù)工作方式相同。
pygame.draw.line(surface, color, start_point, end_point, width) 畫線函數(shù)
pygame.draw.lines(surface, color, closed, pointlist, width) 畫多個(gè)相連的線,從起點(diǎn)到終點(diǎn),與pygame.draw.polygon類似,唯一不同的是,如果closed參數(shù)為False,終點(diǎn)不會(huì)與起點(diǎn)相連接,傳遞True的話,終點(diǎn)會(huì)與起點(diǎn)想連接。
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對(duì)象
pygame沒有單獨(dú)的畫點(diǎn)函數(shù)。而方法就是創(chuàng)建pygame.PixelArray對(duì)象然后設(shè)置獨(dú)立的像素點(diǎn)。創(chuàng)建一個(gè)關(guān)于Surface的PixelArray對(duì)象會(huì)‘鎖住’Surface對(duì)象。一旦Surface對(duì)象被鎖住,畫圖函數(shù)仍然可以使用,但是類似PNG或JPG的圖片就不能作用在Surface對(duì)象上了,如果你想查看一個(gè)Surface對(duì)象是否鎖住了,可以調(diào)用Surface對(duì)象get_locked()方法,如果鎖住了會(huì)返回True,反之False。
設(shè)置這些獨(dú)立像素點(diǎn)的方法是用兩個(gè)索引值訪問,比如pixObj[480][380] = BLACK ,這樣就會(huì)將X坐標(biāo)值的480和Y坐標(biāo)的380這兩個(gè)點(diǎn)設(shè)為黑色。
為了告訴pygame你完成了畫完獨(dú)立像素點(diǎn),你需要通過一個(gè)del語句刪除PixArray對(duì)象。刪除PixArray對(duì)象會(huì)‘解鎖’Surface對(duì)象,那樣你就可以繼續(xù)在上面加載圖片了。如果忘了刪除,則下次你想在Surface對(duì)象上加載圖片的話就會(huì)報(bào)錯(cuò)。
pygame.display.update()函數(shù)
當(dāng)你完成所有畫圖函數(shù)后,你必須調(diào)用pygame.display.update()函數(shù)讓起顯示在顯示器上。
需要記住的一點(diǎn)是pygame.display.update()函數(shù)只會(huì)讓顯示對(duì)象(即通過調(diào)用pygame.display.set_mode()返回的對(duì)象)顯示在屏幕上。如果你想讓圖片顯示在屏幕上,你必須“blit”它們(復(fù)制它們的意思)到顯示對(duì)象上通過blit()方法。
Animation
讓圖像動(dòng)起來其實(shí)很簡(jiǎn)單,就是將圖像從一個(gè)地方移動(dòng)到另一個(gè)地方,就是清除掉圖像原來所在地方的圖像,然后在另一個(gè)地方加載這個(gè)圖像,這樣看上去圖像就像動(dòng)起來了一樣。在計(jì)算機(jī)看來,其實(shí)就是一群像素的移動(dòng)。下圖就是一個(gè)例子
下面是一段示例代碼
import pygame, sys from pygame.locals import *pygame.init()FPS = 30 # frames per second setting fpsClock = pygame.time.Clock()# set up the window DISPLAYSURF = pygame.display.set_mode((400, 300), 0, 32) pygame.display.set_caption('Animation')WHITE = (255, 255, 255) catImg = pygame.image.load('cat.png') catx = 10 caty = 10 direction = 'right'while True: # the main game loopDISPLAYSURF.fill(WHITE)if direction == 'right':catx += 5if catx == 280:direction = 'down'elif direction == 'down':caty += 5if caty == 220:direction = 'left'elif direction == 'left':catx -= 5if catx == 10:direction = 'up'elif direction == 'up':caty -= 5if 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上面已經(jīng)給出了。下載后必須與源文件放在一個(gè)文件夾里面。執(zhí)行效果就是一只貓兒在一個(gè)窗口里面移動(dòng)。先右,再下,再左,再上,如此循環(huán)。
上面這段代碼里面又出現(xiàn)了一些新的東西。
幀率和pygame.time.Clock對(duì)象
幀率與刷新率指的是程序一秒鐘能顯示圖片的數(shù)目,用FPS和幀每秒來表示。(在其它電腦顯示器上,FPS有個(gè)大眾名字叫做赫茲,許多顯示器都有60赫茲的幀速率,或者叫做每秒60幀)低的幀率出現(xiàn)在一些圖像游戲里就會(huì)導(dǎo)致游戲看起來是跳躍和抖動(dòng)的,如果程序有太多的代碼而經(jīng)常刷新屏幕的話,就會(huì)導(dǎo)致FPS下降。但是在這本書里面的游戲因?yàn)樽銐蚝?jiǎn)單所以即使在一些老的電腦上也不會(huì)出現(xiàn)問題。
pygame.time.Clock對(duì)象能夠幫助我們確認(rèn)程序能跑到的一個(gè)最大的確定的FPS值。Clock對(duì)象將在游戲主循環(huán)中插入小小的暫停以確保我們的游戲程序不會(huì)跑的太快。如果我們沒有這些暫停的話,我們的游戲就會(huì)跑得跟電腦一樣快。對(duì)玩游戲的人來說它確實(shí)太快了。在游戲循環(huán)中調(diào)用Clock對(duì)象的tick()方法能保證我們的游戲跑到一個(gè)確定的速度不管電腦跑得有多么快。創(chuàng)建Clock對(duì)象如下語句
fpsClock = pygame.time.Clock()
tick方法應(yīng)該在游戲循環(huán)的最末尾調(diào)用,也就是在pygame.display.update之后,調(diào)用語句如下
fpsClock.tick(FPS)
轉(zhuǎn)載于:https://my.oschina.net/u/1587304/blog/399948
總結(jié)
以上是生活随笔為你收集整理的Make Games with Python Pygame (2)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: yum 简介及其常用命令
- 下一篇: TortoiseSVN status c