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影象函式就不能用了,我們會在以後講詳細的內容。
這次的東西不是很多,基本就是講了一個顯示引數,如果基礎比較好,一看就明白了。不過還是建議實際的輸入寫一下鞏固認識。下一回講字型模組(遊戲沒圖可以,沒字咋整?)~盡請期待