1. 程式人生 > 實用技巧 >pygame 的字型使用

pygame 的字型使用

pygame 的字型使用

pygame 可以直接呼叫系統字型,也可以呼叫 TTF 字型。為了使用字型,應該首先建立一個 Font 物件(不要忘記初始化 pygame),對於系統自帶的字型應該這樣呼叫:

font1 = pygame.font.SysFont('arial', 16)

第1個引數是字型名,第2個引數是字號。在正常情況下系統裡都有 arial 字型,如果沒有會使用預設字型,預設字型和使用者使用的系統有關。

使用者可以使用 pygame.font.get_fonts() 來獲取當前系統所有可用的字型。

另外還有一種呼叫方法是使用自己的 TTF 字型:my_font = pygame.font.Font('my_font.ttf', 16)

這個方法的好處是可以把字型檔案和遊戲一起打包分發,避免玩家計算機上沒有這個字型而無法顯示的問題。一旦有了 Font 物件,就可以使用 render() 方法來設定文字內容,然後通過 blit() 方法寫到螢幕上。

text = font1.render("坦克大戰", True, (0, 0, 0), (255, 255,255))

render() 方法的第1個引數是寫入的文字內容;第2個引數是布林值,說明是否開啟抗鋸齒;第3個引數是字型本身的顏色;第4個引數是背景的顏色。如果不想有背景色,也就是讓背景透明,可以不加第4個引數。

例如自己定義一個文書處理函式 show_text(), 其中引數 surface_handle 是 surface 控制代碼,pos 為文字顯示位置,corlor 為文字顏色,font_size 為字型大小,font_bold 為文字是否加粗,font_italic 為文字是否斜體。

def show_text(surface_handle, pos, text, color, font_size = 13, font_bold = False, font_italic = False):
    # cur_font = pygame.font.SysFont('宋體', font_size)		# 獲取系統字型
    cur_font = pygame.font.Font('simafang.ttf', 30)			 # 獲取字型,並設定大小
    cur_font.set_bold(font_bold)							 # 設定是否加粗
    cur_font.set_italic(font_italic)						 # 設定是否斜體
    text_fmt = cur_font.render(text, 1, color)				 # 設定文字內容
    surface_handle.blit(text_fmt, pos)						 # 繪製文字

在更新視窗內容 pygame.display.update() 之前加入:

text = "坦克大戰"
show_text(screen, (20, 220), text, (255, 0, 0), True)
text = "坦克位置:(%d, %d)" % (tank_rect.left, tank_rect.top)
show_text(screen, (20, 420), text, (0, 255, 255), True)

此時會在螢幕的(20,220)處顯示紅色的“坦克大戰”文字,並且在(20,420)顯示現在坦克所處位置的座標,移動坦克,位置座標文字隨之改變。

完整程式碼如下:

import pygame


def show_text(surface_handle, pos, text, color, font_size = 20, font_bold = False, font_italic = False):
    cur_font = pygame.font.SysFont("華文宋體", font_size)
    cur_font.set_bold(font_bold)
    cur_font.set_italic(font_italic)
    text_message = cur_font.render(text, 1, color)
    surface_handle.blit(text_message, pos)


def tank_play():
    pygame.init()
    tank_image = pygame.image.load(r"../images/tank.png")
    tank_rect = tank_image.get_rect()
    back_image = pygame.image.load(r"../images/background2.jpg")
    back_rect = back_image.get_rect()
    screen = pygame.display.set_mode(back_rect.size)
    pygame.display.set_caption("使用者方向鍵控制坦克移動")
    tank_rect.center = back_rect.center
    offset = 2                            
    fps_clock = pygame.time.Clock()
    while True:
        fps_clock.tick(60)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                exit()
        keys_pressed = pygame.key.get_pressed()
        if keys_pressed[pygame.K_RIGHT]:
            tank_rect.x += offset
        if keys_pressed[pygame.K_LEFT]:
            tank_rect.x -= offset
        if keys_pressed[pygame.K_UP]:
            tank_rect.y -= offset
        if keys_pressed[pygame.K_DOWN]:
            tank_rect.y += offset
        tank_rect.clamp_ip(back_rect)
        screen.blit(back_image, back_rect)
        screen.blit(tank_image, tank_rect)

        text = "坦克大戰"
        show_text(screen, (20, 220), text, (255, 0, 0))
        text = f"坦克位置:({tank_rect.x},{tank_rect.y})"
        show_text(screen, (20, 250), text, (0, 255, 255))
        pygame.display.update()


if __name__ == '__main__':
    tank_play()
    

程式執行結果如下所示: