我們上一個章節使用了pygame.draw中的一些函式,這個模組的作用是在螢幕上繪製各種圖形。事實上,你可以不載入任何圖片,只是要這些圖形來製作一個遊戲(經典遊戲Asteroids便是,這裡有一個HTML5寫就的例子。好像訪問不了?搜個Flash版吧,多得很)。
注:該圖與該文無任何聯絡(最近在玩神鬼寓言3,感覺還是不錯的~)
pygame.draw中函式的第一個引數總是一個surface,然後是顏色,再後會是一系列的座標等。稍有些計算機繪圖經驗的人就會知道,計算機裡的座標,(0,0)代表左上角。而返回值是一個Rect物件,包含了繪製的領域,這樣你就可以很方便的更新那個部分了。
函式 | 作用 |
---|---|
rect | 繪製矩形 |
polygon | 繪製多邊形(三個及三個以上的邊) |
circle | 繪製圓 |
ellipse | 繪製橢圓 |
arc | 繪製圓弧 |
line | 繪製線 |
lines | 繪製一系列的線 |
aaline | 繪製一根平滑的線 |
aalines | 繪製一系列平滑的線 |
我們下面一個一個詳細說明。
pygame.draw.rect
用法:pygame.draw.rect(Surface, color, Rect, width=0)
pygame.draw.rect在surface上畫一個矩形,除了surface和color,rect接受一個矩形的座標和線寬引數,如果線寬是0或省略,則填充。我們有一個另外的方法來畫矩形——fill方法,如果你還記得的話。事實上fill可能還會快一點點,因為fill由顯示卡來完成。
pygame.draw.polygon
用法:pygame.draw.polygon(Surface, color, pointlist, width=0)
polygon就是多邊形,用法類似rect,第一、第二、第四的引數都是相同的,只不過polygon會接受一系列座標的列表,代表了各個頂點。
pygame.draw.circle
用法:pygame.draw.circle(Surface, color, pos, radius, width=0)
很簡單,畫一個圓。與其他不同的是,它接收一個圓心座標和半徑引數。
pygame.draw.ellipse
用法:pygame.draw.ellipse(Surface, color, Rect, width=0)
你可以把一個ellipse想象成一個被壓扁的圓,事實上,它是可以被一個矩形裝起來的。pygame.draw.ellipse的第三個引數就是這個橢圓的外接矩形。
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)
我相信所有的人都能看明白。
pygame.draw.lines
用法:pygame.draw.lines(Surface, color, closed, pointlist, width=1)
closed是一個布林變數,指明是否需要多畫一條線來使這些線條閉合(感覺就和polygone一樣了),pointlist是一個點的陣列。
上面的表中我們還有aaline和aalines,玩遊戲的都知道開出“抗鋸齒(antialiasing)”效果會讓畫面更好看一些,模型的邊就不會是鋸齒形的了,這兩個方法就是在畫線的時候做這事情的,引數和上面一樣,省略。
我們用一個混雜的例子來演示一下上面的各個方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
#!/usr/bin/env python import pygame from pygame.locals import * from sys import exit from random import * from math import pi pygame.init() screen = pygame.display.set_mode((640, 480), 0, 32) points = [] while True: for event in pygame.event.get(): if event.type == QUIT: exit() if event.type == KEYDOWN: # 按任意鍵可以清屏並把點回復到原始狀態 points = [] screen.fill((255,255,255)) if event.type == MOUSEBUTTONDOWN: screen.fill((255,255,255)) # 畫隨機矩形 rc = (randint(0,255), randint(0,255), randint(0,255)) rp = (randint(0,639), randint(0,479)) rs = (639-randint(rp[0], 639), 479-randint(rp[1], 479)) pygame.draw.rect(screen, rc, Rect(rp, rs)) # 畫隨機圓形 rc = (randint(0,255), randint(0,255), randint(0,255)) rp = (randint(0,639), randint(0,479)) rr = randint(1, 200) pygame.draw.circle(screen, rc, rp, rr) # 獲得當前滑鼠點選位置 x, y = pygame.mouse.get_pos() points.append((x, y)) # 根據點選位置畫弧線 angle = (x/639.)*pi*2. pygame.draw.arc(screen, (0,0,0), (0,0,639,479), 0, angle, 3) # 根據點選位置畫橢圓 pygame.draw.ellipse(screen, (0, 255, 0), (0, 0, x, y)) # 從左上和右下畫兩根線連線到點選位置 pygame.draw.line(screen, (0, 0, 255), (0, 0), (x, y)) pygame.draw.line(screen, (255, 0, 0), (640, 480), (x, y)) # 畫點選軌跡圖 if len(points) > 1: pygame.draw.lines(screen, (155, 155, 0), False, points, 2) # 和軌跡圖基本一樣,只不過是閉合的,因為會覆蓋,所以這裡註釋了 #if len(points) >= 3: # pygame.draw.polygon(screen, (0, 155, 155), points, 2) # 把每個點畫明顯一點 for p in points: pygame.draw.circle(screen, (155, 155, 155), p, 3) pygame.display.update() |
執行這個程式,在上面點滑鼠就會有圖形出來了;按任意鍵可以重新開始。另外這個程式只是各個命令的堆砌,並不見得是一個好的程式程式碼。
到這次為止,文字、顏色、影象、圖形都講好了,靜態顯示的部分都差不多了。然而多彩的遊戲中只有靜態的東西實在太讓人寒心了(GalGame大多如此),下次開始我們學習遊戲中的動畫製作。