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