2020年9月12日星期六

84 《零基礎入門學習Python》筆記 第084講:Pygame:基本圖形繪製

《零基礎入門學習Python》第084講:Pygame:基本圖形繪製



今天我們開始學習Pygame 的基本圖形繪製。有些人就會疑惑了,你上節課不是說大多數遊戲都是由圖片構成的嗎,不是說顏值高於一切嗎,不是說顏值對一個遊戲來說很重要嗎,我們學習Pygame就是為了遊戲開發,那你現在教我們基本圖形繪製對遊戲開發有什麼用呢?
其實,繪製基本圖形對於遊戲開發不是沒有用,說來也奇怪,現在有些像素遊戲也很火啊,它們就是由一些簡單的圖形繪製的小遊戲,我這裡總結了一下,有幾個原因:
  1. 唯美的遊戲界面越來越多,層出不窮,所以呢,玩家朋友們會出現審美疲勞。
  2. 時下盛行的就是簡約風格,只要你的遊戲能夠讓大家看得舒服,玩得舒服,一般大家都不會拒絕簡單的遊戲;
  3. 大型的遊戲的CG動畫繪製需要耗費相當的人力、物力和財力。
  4. 簡單的遊戲更容易開發,小遊戲工作室或個人即可完成開發,有更多逆襲的機會。
  5. 遊戲依託的主要平台已經從電腦端轉移到手機端,那麼小一個屏幕你把圖像做得惟妙惟肖意義並不大。
說這麼多,只是為了說明,在Pygame中,簡單的圖形繪製真的有用。大家一定要認真學好。
Pygame的draw 模塊提供了繪製簡單圖形的方法。支持繪製的圖形有矩形、多邊形、圓形、橢圓形、弧形以及各種線條。好吧,我們首先來談談繪製矩形。
繪製矩形,我們使用rect() 方法:
pygame.draw.rect()
rect(表面,顏色,矩形,寬度= 0)
在Surface對像上繪製一個矩形。color 表示邊框的顏色。Rect 參數指定矩形的位置和尺寸。width 參數指定邊框的寬度,如果設置為0 則表示填充該矩形。
舉個例子:
  1. import pygame
  2. import sys
  3. from pygame.locals import *
  4. pygame.init()
  5. WHITE = (255, 255, 255)
  6. BLACK = (0, 0, 0)
  7. size = width, height = 640, 200
  8. screen = pygame.display.set_mode(size)
  9. pygame.display.set_caption("Python Demo")
  10. clock = pygame.time.Clock()
  11. while True:
  12. for event in pygame.event.get():
  13. if event.type == QUIT:
  14. sys.exit()
  15. screen.fill(WHITE)
  16. pygame.draw.rect(screen, BLACK, (50, 50, 150, 50), 0)
  17. pygame.draw.rect(screen, BLACK, (250, 50, 150, 50), 1)
  18. pygame.draw.rect(screen, BLACK, (450, 50, 150, 50), 10)
  19. pygame.display.flip()
  20. clock.tick(10)
大家可以看到,當我們把width 設為0 的時候,它是使用邊框的顏色填充,width = 1 時,就是不填充,邊框寬度為1,我們通過右圖還可以看到,邊框是向外擴展的。
因為這個不是一個移動的圖形,我們把幀率可以調低一點,這裡就設為10。

pygame.draw.polygon()
繪製多邊形。
多邊形(表面,顏色,點列表,寬度= 0) 
在Surface對像上繪製一個多邊形。pointlist 參數指定多邊形的各個頂點。width 參數指定邊框的寬度,如果設置為0 則表示填充該矩形。
  1. import pygame
  2. import sys
  3. from pygame.locals import *
  4. pygame.init()
  5. WHITE = (255, 255, 255)
  6. BLACK = (0, 0, 0)
  7. GREEN = (0, 255, 0)
  8. points = [(200, 75), (300, 25), (400, 75), (450, 25), (450, 125), (400, 75), (300, 125)]
  9. size = width, height = 640, 200
  10. screen = pygame.display.set_mode(size)
  11. pygame.display.set_caption("Python Demo")
  12. clock = pygame.time.Clock()
  13. while True:
  14. for event in pygame.event.get():
  15. if event.type == QUIT:
  16. sys.exit()
  17. screen.fill(WHITE)
  18. pygame.draw.polygon(screen, GREEN, points, 0)
  19. pygame.display.flip()
  20. clock.tick(10)

pygame.draw.circle()
根據圓心和半徑繪製圓形。
圓(表面,顏色,位置,半徑,寬度= 0) 
在Surface對像上繪製一個圓形。pos 參數指定圓心的位置,radius 參數指定圓的半徑。width 參數指定邊框的寬度,如果設置為0 則表示填充該矩形。
  1. import pygame
  2. import sys
  3. from pygame.locals import *
  4. pygame.init()
  5. WHITE = (255, 255, 255)
  6. BLACK = (0, 0, 0)
  7. GREEN = (0, 255, 0)
  8. RED = (255, 0, 0)
  9. BLUE = (0, 0, 255)
  10. size = width, height = 640, 480
  11. screen = pygame.display.set_mode(size)
  12. pygame.display.set_caption("Python Demo")
  13. position = size[0]//2, size[1]//2
  14. moving = False
  15. clock = pygame.time.Clock()
  16. while True:
  17. for event in pygame.event.get():
  18. if event.type == QUIT:
  19. sys.exit()
  20. if event.type == MOUSEBUTTONDOWN:
  21. if event.button == 1:
  22. moving = True
  23. if event.type == MOUSEBUTTONUP:
  24. if event.button == 1:
  25. moving = False
  26. if moving:
  27. position = pygame.mouse.get_pos()
  28. screen.fill(WHITE)
  29. pygame.draw.circle(screen, RED, position, 25, 1)
  30. pygame.draw.circle(screen, GREEN, position, 75, 1)
  31. pygame.draw.circle(screen, BLUE, position, 125, 1)
  32. pygame.display.flip()
  33. clock.tick(120)
我們實現一個可以通過鼠標拖拽的3同心圓。

說完圓形,我們再來說說橢圓形,在Tkinter裡面,圓形和橢圓形的繪製方法是一樣的,但在Pygame中,兩者是分開的。
pygame.draw.ellipse()
根據限定矩形繪製一個橢圓形。
橢圓(表面,顏色,矩形,寬度= 0) 
在Surface 對像上繪製一個橢圓形。Rect 參數指定橢圓外圍的限定矩形(當此矩形為正方形時,得到的也是圓形)。width 參數指定邊框的寬度,如果設置為0 則表示填充該矩形。
  1. import pygame
  2. import sys
  3. from pygame.locals import *
  4. pygame.init()
  5. WHITE = (255, 255, 255)
  6. BLACK = (0, 0, 0)
  7. GREEN = (0, 255, 0)
  8. RED = (255, 0, 0)
  9. BLUE = (0, 0, 255)
  10. size = width, height = 640, 300
  11. screen = pygame.display.set_mode(size)
  12. pygame.display.set_caption("Python Demo")
  13. clock = pygame.time.Clock()
  14. while True:
  15. for event in pygame.event.get():
  16. if event.type == QUIT:
  17. sys.exit()
  18. screen.fill(WHITE)
  19. pygame.draw.ellipse(screen, GREEN, (220, 50, 200, 200), 0)
  20. pygame.draw.ellipse(screen, BLACK, (100, 100, 440, 100), 1)
  21. pygame.display.flip()
  22. clock.tick(10)

pygame.draw.arc()
繪製弧線。
弧(表面,顏色,矩形,起始角度,終止角度,寬度= 1) 
在Surface 對像上繪製一條弧線。Rect 參數指定弧線所在的橢圓外圍的限定矩形。兩個angle 參數指定弧線的開始和結束位置。width 參數指定邊框的寬度。
  1. import pygame
  2. import sys
  3. import math
  4. from pygame.locals import *
  5. pygame.init()
  6. WHITE = (255, 255, 255)
  7. BLACK = (0, 0, 0)
  8. GREEN = (0, 255, 0)
  9. RED = (255, 0, 0)
  10. BLUE = (0, 0, 255)
  11. size = width, height = 640, 300
  12. screen = pygame.display.set_mode(size)
  13. pygame.display.set_caption("Python Demo")
  14. clock = pygame.time.Clock()
  15. while True:
  16. for event in pygame.event.get():
  17. if event.type == QUIT:
  18. sys.exit()
  19. screen.fill(WHITE)
  20. pygame.draw.arc(screen, BLACK, (100, 100, 440, 100), 0, math.pi, 1)
  21. pygame.draw.arc(screen, BLACK, (220, 50, 200, 200), math.pi, math.pi * 2, 1)
  22. pygame.display.flip()
  23. clock.tick(10)

最後來談談繪製線段:
這裡有line() 方法和lines() 方法,分別用於繪製一條線段和多條線段。其中lines() 方法如果closed 參數設置為True,則繪製首尾相連,這和前面的polygon() 方法有點像,但是線段的概念就是一條線或者多條線,是不會包圍起來的,所以不能填充,把width 設為0就不顯示了,而不是填充。
前面的弧線也是不能填充的。
pygame.draw.line()
繪製線段。
行(表面,顏色,start_pos,end_pos,width = 1)
在Surface 對像上繪製一條線段。兩端以方形結束。
pygame.draw.lines()
繪製多條連續的線段。
線(表面,顏色,封閉線,點列表,寬度= 1) 
在Surface 對像上繪製一系列連續的線段。pointlist 參數是一系列短點。如果closed 參數設置為True,則繪製首尾相連。

aaline() 和aalines() 是繪製抗鋸齒的線段。最後一個參數不是width 而是blend,指定是否通過繪製混合背景的陰影來實現抗鋸齒功能,由於沒有width 選項,所以這兩個方法只能繪製唯一像素寬度值的線段。
pygame.draw.aaline()
繪製抗鋸齒的線段。
aaline(表面,顏色,起點,終點,混合= 1) 
在Surface 對像上繪製一條抗鋸齒的線段。blend 參數指定是否通過繪製混合背景的陰影來實現抗鋸齒功能。該函數的結束位置允許使用浮點數。
pygame.draw.aalines()
繪製多條連續的線段(抗鋸齒)。
aalines(表面,顏色,封閉,點列表,混合= 1) 
在Surface 對像上繪製一系列連續的線段(抗鋸齒)。如果closed 參數為True,則首尾相連。blend 參數指定是否通過繪製混合背景的陰影來實現抗鋸齒功能。該函數的結束位置允許使用浮點數。
  1. import pygame
  2. import sys
  3. from pygame.locals import *
  4. pygame.init()
  5. WHITE = (255, 255, 255)
  6. BLACK = (0, 0, 0)
  7. GREEN = (0, 255, 0)
  8. points = [(200, 75), (300, 25), (400, 75), (450, 25), (450, 125), (400, 75), (300, 125)]
  9. size = width, height = 640, 480
  10. screen = pygame.display.set_mode(size)
  11. pygame.display.set_caption("Python Demo")
  12. clock = pygame.time.Clock()
  13. while True:
  14. for event in pygame.event.get():
  15. if event.type == QUIT:
  16. sys.exit()
  17. screen.fill(WHITE)
  18. pygame.draw.lines(screen, GREEN, 1, points, 1)
  19. pygame.draw.line(screen, BLACK, (100, 200), (540, 250), 1)
  20. pygame.draw.aaline(screen, BLACK, (100, 250), (540, 300), 1)
  21. pygame.draw.aaline(screen, BLACK, (100, 300), (540, 350), 0)
  22. pygame.display.flip()
  23. clock.tick(10)
開啟抗鋸齒就會把線段旁邊的鋸齒變成陰影,看起來就比較光滑一點,特別是當你放在一定的背景上時,它會根據背景圖片來調整線段附近的像素值,看上去就比較光滑。
這就是我們這節課的內容,儘管我們看到了,就目前而言,Pygame 的draw 模塊中的繪製基本圖形的方法十分有限,功能不如我們前面介紹的Tkinter 的Canvas 組件,但是Pygame 是在逐步發展中的,我們希望它的繪製圖形模塊能夠越來越好。
我們在後面的課程中也會介紹用這些基本的圖形來開發簡單的小遊戲,大家拭目以待吧。

0 留言:

發佈留言