不過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的基礎就到這裡,後面我們會進行一些高階的介紹,下一次的話,就開始講畫東西了~