Make Games with Python & Pygame (2)

接着上次的繼續。python

 

簡單的畫圖函數函數

Pygame給咱們提供了幾個簡單的畫圖函數,好比畫矩形,圓,橢圓,線,獨立的像素點。oop

下面這個程序就實現了一些簡單畫圖的操做ui

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] = BLACK

del pixObj

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    pygame.display.update()

執行後的效果如圖


這裏面有多一些新的Pygame的東西spa

fill(color)是Surface對象的一種方法,將surface對象的窗口所有填充一種顏色,就是背景色。code

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, 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 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)

相關文章
相關標籤/搜索