1. 程式人生 > >如何用Pygame寫遊戲(七)

如何用Pygame寫遊戲(七)

我們上一個章節使用了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)”效果會讓畫面更好看一些,模型的邊就不會是鋸齒形的了,這兩個方法就是在畫線的時候做這事情的,引數和上面一樣,省略。

我們用一個混雜的例子來演示一下上面的各個方法:


Python


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
  1. #!/usr/bin/env python
  2. importpygame
  3. frompygame.localsimport*
  4. fromsysimportexit
  5. fromrandomimport*
  6. frommathimportpi
  7. pygame.init()
  8. screen=pygame.display.set_mode((640,480),0,32)
  9. points=[]
  10. whileTrue:
  11. foreventinpygame.event.get():
  12. ifevent.type==QUIT:
  13. exit()
  14. ifevent.type==KEYDOWN:
  15. # 按任意鍵可以清屏並把點回復到原始狀態
  16. points=[]
  17. screen.fill((255,255,255))
  18. ifevent.type==MOUSEBUTTONDOWN:
  19. screen.fill((255,255,255))
  20. # 畫隨機矩形
  21. rc=(randint(0,255),randint(0,255),randint(0,255))
  22. rp=(randint(0,639),randint(0,479))
  23. rs=(639-randint(rp[0],639),479-randint(rp[1],479))
  24. pygame.draw.rect(screen,rc,Rect(rp,rs))
  25. # 畫隨機圓形
  26. rc=(randint(0,255),randint(0,255),randint(0,255))
  27. rp=(randint(0,639),randint(0,479))
  28. rr=randint(1,200)
  29. pygame.draw.circle(screen,rc,rp,rr)
  30. # 獲得當前滑鼠點選位置
  31. x,y=pygame.mouse.get_pos()
  32. points.append((x,y))
  33. # 根據點選位置畫弧線
  34. angle=(x/639.)*pi*2.
  35. pygame.draw.arc(screen,(0,0,0),(0,0,639,479),0,angle,3)
  36. # 根據點選位置畫橢圓
  37. pygame.draw.ellipse(screen,(0,255,0),(0,0,x,y))
  38. # 從左上和右下畫兩根線連線到點選位置
  39. pygame.draw.line(screen,(0,0,255),(0,0),(x,y))
  40. pygame.draw.line(screen,(255,0,0),(640,480),(x,y))
  41. # 畫點選軌跡圖
  42. iflen(points)>1:
  43. pygame.draw.lines(screen,(155,155,0),False,points,2)
  44. # 和軌跡圖基本一樣,只不過是閉合的,因為會覆蓋,所以這裡註釋了
  45. #if len(points) >= 3:
  46. # pygame.draw.polygon(screen, (0, 155, 155), points, 2)
  47. # 把每個點畫明顯一點
  48. forpinpoints:
  49. pygame.draw.circle(screen,(155,155,155),p,3)
  50. pygame.display.update()



執行這個程式,在上面點滑鼠就會有圖形出來了;按任意鍵可以重新開始。另外這個程式只是各個命令的堆砌,並不見得是一個好的程式程式碼。

到這次為止,文字、顏色、影象、圖形都講好了,靜態顯示的部分都差不多了。然而多彩的遊戲中只有靜態的東西實在太讓人寒心了(GalGame大多如此),下次開始我們學習遊戲中的動畫製作。