不過5月上旬,氣溫居然就到了33℃,這日子真是不讓人活了……
另外今天是母親節啊,不知道上什麼圖片就上這張吧~~
今天說明字型模組和一些錯誤處理。
使用字型模組
就像上一次說的,一個遊戲,再怎麼寒磣也得有文字,俄羅斯方塊還有個記分數的呢;印象中沒有文字的電子遊戲只有電腦剛剛誕生的那種打乒乓的了。Pygame可以直接呼叫系統字型,或者也可以使用TTF字型,稍有點電腦知識的都知道這是什麼。為了使用字型,你得先建立一個Font物件,對於系統自帶的字型:
1
|
my_font = pygame.font.SysFont("arial", 16)
|
第一個引數是字型名,第二個自然就是大小,一般來說“Arial”字型在很多系統都是存在的,如果找不到的話,就會使用一個預設的字型,這個預設的字型和每個作業系統相關,你也可以使用pygame.font.get_fonts()來獲得當前系統所有可用字型。還有一個更好的方法的,使用TTF的方法:
1
|
my_font = pygame.font.Font("my_font.ttf", 16)
|
這個語句使用了一個叫做“my_font.ttf”,這個方法之所以好是因為你可以把字型檔案隨遊戲一起分發,避免使用者機器上沒有需要的字型。。一旦你建立了一個font物件,你就可以使用render方法來寫字了,然後就能blit到螢幕上:
1
|
text_surface = my_font.render("Pygame is cool!", True, (0,0,0), (255, 255, 255))
|
第一個引數是寫的文字;第二個引數是個布林值,以為這是否開啟抗鋸齒,就是說True的話字型會比較平滑,不過相應的速度有一點點影響;第三個引數是字型的顏色;第四個是背景色,如果你想沒有背景色(也就是透明),那麼可以不加這第四個引數。
下面是一個小例子演示下文字的使用,不過並不是顯示在螢幕上,而是存成一個圖片檔案
1
2
3
4
5
6
|
my_name = "Will McGugan"
import pygame
pygame.init()
my_font = pygame.font.SysFont("arial", 64)
name_surface = my_font.render(my_name, True, (0, 0, 0), (255, 255, 255))
pygame.image.save(name_surface, "name.png")
|
追加說明一下如何顯示中文,這在原書可是沒有的哦:) 簡單來說,首先你得用一個可以使用中文的字型,宋體、黑體什麼的,或者你直接用中文TTF檔案,然後文字使用unicode,即u”中文的文字”這種,最後不要忘了原始檔里加上一句關於檔案編碼的“魔法註釋”,具體的可以查一下Python的編碼方面的文章。舉一個這樣的例子:
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
|
# -*- coding: utf-8 -*-
# 記住上面這行是必須的,而且儲存檔案的編碼要一致!
import pygame
from pygame.locals import *
from sys import exit
pygame.init()
screen = pygame.display.set_mode((640, 480), 0, 32)
#font = pygame.font.SysFont("宋體", 40)
#上句在Linux可行,在我的Windows 7 64bit上不行,XP不知道行不行
#font = pygame.font.SysFont("simsunnsimsun", 40)
#用get_fonts()檢視後看到了這個字型名,在我的機器上可以正常顯示了
font = pygame.font.Font("simsun.ttc", 40)
#這句話總是可以的,所以還是TTF檔案保險啊
text_surface = font.render(u"你好", True, (0, 0, 255))
x = 0
y = (480 - text_surface.get_height())/2
background = pygame.image.load("sushiplate.jpg").convert()
while True:
for event in pygame.event.get():
if event.type == QUIT:
exit()
screen.blit(background, (0, 0))
x -= 2 # 文字滾動太快的話,改改這個數字
if x < -text_surface.get_width():
x = 640 - text_surface.get_width()
screen.blit(text_surface, (x, y))
pygame.display.update()
|
Pygame的錯誤處理
程式總會出錯的,比如當記憶體用盡的時候Pygame就無法再載入圖片,或者檔案根本就不存在。再比如下例:
1
2
3
4
5
6
7
|
>>> import pygame
>>> screen = pygame.display.set_mode((640, -1))
---------------------------------
Traceback (most recent call last):
File "<interactive input>", line 1, in ?
pygame.error: Cannot set 0 sized display mode
----------------------------------
|
對付這種錯誤一個比較好的方法:
1
2
3
4
5
6
|
try:
screen = pygame.display.set_mode(SCREEN_SIZE)
except pygame.error, e:
print "Can't create the display :-("
print e
exit()
|
其實就是Python的標準的錯誤捕捉方法就是了,實際的遊戲(或者程式)中,錯誤捕捉實在太重要了,如果你寫過比較大的應用,應該不用我來說明這一點,Pygame中也是一樣的。
Pygame的基礎就到這裡,後面我們會進行一些高階的介紹,下一次的話,就開始講畫東西了~