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

pythontab發表於2012-12-20

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

OK,到該講顯示的時候了。沒人可以否定好的畫面是一款遊戲吸引人最直接最誘人的因素,雖說濫畫面高遊戲度的作品也有,但優秀的畫面無疑是一張過硬的通行證,可以讓你爭取到更多的機會。

其實上兩回也已經開啟過顯示了,不過沒有特別說明而已,pygame.display.set_mode(xxx)就是建立一個遊戲視窗,也就是顯示的意思。

全屏顯示

我們在第一個程式裡使用瞭如下的語句

1
screen = pygame.display.set_mode((640, 480), 0, 32)

也講述了各個引數的意思,當我們把第二個引數設定為FULLSCREEN時,就能得到一個全屏視窗了

 

1
screen = pygame.display.set_mode((640, 480), FULLSCREEN, 32)

注意:如果你的程式有什麼問題,很可能進入了全屏模式就不太容易退出來了,所以最好先用視窗模式除錯好,再改為全屏模式。

在全屏模式下,顯示卡可能就切換了一種模式,你可以用如下程式碼獲得您的機器支援的顯示模式:

1
2
3
>>> import pygame
>>> pygame.init()
>>> pygame.display.list_modes()

看一下一個例項:

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
background_image_filename = 'sushiplate.jpg'
 
import pygame
from pygame.locals import *
from sys import exit
 
pygame.init()
screen = pygame.display.set_mode((640, 480), 0, 32)
background = pygame.image.load(background_image_filename).convert()
 
Fullscreen = False
 
while True:
 
    for event in pygame.event.get():
        if event.type == QUIT:
            exit()
    if event.type == KEYDOWN:
        if event.key == K_f:
            Fullscreen = not Fullscreen
            if Fullscreen:
                screen = pygame.display.set_mode((640, 480), FULLSCREEN, 32)
            else:
                screen = pygame.display.set_mode((640, 480), 0, 32)
 
    screen.blit(background, (0,0))
    pygame.display.update()

執行這個程式,預設還是視窗的,按“f ”,顯示模式會在視窗和全屏之間切換。程式也沒有什麼難度,應該都能看明白。

可變尺寸的顯示

雖然一般的程式視窗都能拖邊框來改變大小,pygame的預設顯示視窗是不行的,而事實上,很多遊戲確實也不能改變顯示視窗的大小,我們可以使用一個引數來改變這個預設行為。

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
background_image_filename = 'sushiplate.jpg'
 
import pygame
from pygame.locals import *
from sys import exit
 
SCREEN_SIZE = (640, 480)
 
pygame.init()
screen = pygame.display.set_mode(SCREEN_SIZE, RESIZABLE, 32)
 
background = pygame.image.load(background_image_filename).convert()
 
while True:
 
    event = pygame.event.wait()
    if event.type == QUIT:
        exit()
    if event.type == VIDEORESIZE:
        SCREEN_SIZE = event.size
        screen = pygame.display.set_mode(SCREEN_SIZE, RESIZABLE, 32)
        pygame.display.set_caption("Window resized to "+str(event.size))
 
    screen_width, screen_height = SCREEN_SIZE
    # 這裡需要重新填滿視窗
    for y in range(0, screen_height, background.get_height()):
        for x in range(0, screen_width, background.get_width()):
            screen.blit(background, (x, y))
 
    pygame.display.update()

當你更改大小的時候,後端控制檯會顯示出新的尺寸,這裡我們學習到一個新的事件VIDEORESIZE,它包含如下內容:

  • size  —  一個二維元組,值為更改後的視窗尺寸,size[0]為寬,size[1]為高
  • w  —  寬
  • h  —  一目瞭然,高;之所以多出這兩個,無非是為了方便

注意:在我的Windows 7 64bit上執行的時候,一改變視窗大小就非法退出;在Linux機器上很正常,應該是系統的相容性問題(Pygame還只支援32位),不過想來平時都不會更改遊戲視窗大小,問題不大。

至於無邊框的視窗等,看一看本教程的第一篇就能知道了,不再贅述。

其他、複合模式

我們還有一些其他的顯示模式,但未必所有的作業系統都支援(放心windows、各種比較流行的Linux發行版都是沒問題的),一般來說視窗就用0全屏就用FULLSCREEN,這兩個總是OK的。

如果你想建立一個硬體顯示(surface會存放在視訊記憶體裡,從而有著更高的速度),你必須和全屏一起使用:

1
screen = pygame.display.set_mode(SCREEN_SIZE, HWSURFACE | FULLSCREEN, 32)

當然你完全可以把雙緩衝(更快)DOUBLEBUF也加上,這就是一個很棒的遊戲顯示了,不過記得你要使用pygame.display.flip()來重新整理顯示。pygame.display.update()是將資料畫到前面顯示,而這個是交替顯示的意思。

稍微說一下雙緩衝的意思,可以做一個比喻:我的任務就是出黑板報,如果只有一塊黑板,那我得不停的寫,全部寫完了稍微Show一下就要擦掉重寫,這樣一來別人看的基本都是我在寫黑板報的過程,看到的都是不完整的黑板報;如果我有兩塊黑板,那麼可以掛一塊給別人看,我自己在底下寫另一塊,寫好了把原來的換下來換上新的,這樣一來別人基本總是看到完整的內容了。雙緩衝就是這樣維護兩個顯示區域,快速的往螢幕上換內容,而不是每次都慢慢地重畫。

還有OPENGL模式,這是一個得到廣泛應用的3D加速顯示模式。不過一旦使用了這個模式,pygame中的2D影像函式就不能用了,我們會在以後講詳細的內容。

這次的東西不是很多,基本就是講了一個顯示引數,如果基礎比較好,一看就明白了。不過還是建議實際的輸入寫一下鞏固認識。下一回講字型模組(遊戲沒圖可以,沒字咋整?)~盡請期待


相關文章