用Pygame和Python做遊戲-從入門到精通(7)

pythontab發表於2012-12-20

用Python和Pygame寫遊戲-從入門到精通(7)

我們上一個章節使用了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大多如此),下次開始我們學習遊戲中的動畫製作。


相關文章