如何在遊戲中使用輸入法進行文字輸入
訂閱 375
Pygame 實作輸入法輸入文字,及其開啟/關閉方法影片示範 YouTube
Pygame 中的文字輸入
Pygame 允許玩家在遊戲中使用作業系統的輸入法進行文字輸入,這需要用到key
模組。如果支援,將在輸入過程中顯示熒幕鍵盤或輸入法編輯器。
你可以通過文字輸入事件獲得玩家輸入的文字,通過文字編輯事件獲得玩家輸入的合成文字。合成文字是指可被轉換為真正輸入文字的文字,比如,書寫的註音。
pygame
模組的TEXTINPUT
變數,對應了文字輸入事件,該事件可在確定某段輸入文字時被引發(比如,在書寫註音後按Enter鍵確認,或在視窗失去輸入焦點後),其對應的Event
物件擁有以下變數。
- text 變數
text
變數是一個字串,表示此次直接輸入的文字,或合成文字所轉換的輸入文字。
pygame
模組的TEXTEDITING
變數,對應了文字編輯事件,該事件在合成文字被編輯時引發(比如,書寫註音,或書寫註音後按下方向鍵移動遊標),其對應的Event
物件擁有以下變數。
- text 變數
text
變數是一個表示合成文字的字串。- start 變數
start
變數是一個整數,表示遊標在合成文字中的位置。- length 變數
length
變數是一個整數,表示合成文字被選取的文字的長度。
某些輸入法或語言僅會引發文字輸入事件
並非所有的輸入法或語言均會引發文字輸入和文字編輯事件,比如,英文輸入法,他可能只會引發文字輸入事件。
某些情況下一些按鍵不會引發文字輸入事件
在使用輸入法的狀態下,一些按鍵不會引發文字輸入事件,比如Escape,按下Escape鍵可能只會引發按鍵的按下事件或文字編輯事件(具體情況由輸入法和語言決定)。
開啟輸入法進行文字輸入
key
模組的start_text_input
函式,可用於開啟輸入法,這使得玩家可以使用系統目前的輸入法進行文字輸入。呼叫該函式將使 Pygame 開始接收文字輸入以及文字編輯事件,直到呼叫stop_text_input
函式。
遊戲啟動後,Pygame 會預設開啟輸入法,並接收文字輸入以及文字編輯事件,因此,呼叫start_text_input
可能是沒有必要的。
start_text_input()
start_text_input 函式可能會封鎖鍵盤事件
對於某些輸入法或語言,比如中文的註音輸入法,在呼叫start_text_input
函式之後,鍵盤按鍵的按下和釋放事件可能會在某個階段被封鎖。如果通過鍵盤事件來控製遊戲角色,那麽按下按鍵可能不會對遊戲角色產生任何影響,直至呼叫stop_text_input
函式或切換輸入法。
當然,某些特殊的按鍵,比如Escape,依然可能會正常引發按下和釋放事件(具體情況由輸入法和語言決定)。
在下面的範例中,我們呼叫start_text_input
來開啟輸入法(其實可以忽略),在文字編輯和文字輸入事件中,分別記錄了玩家書寫的合成文字和輸入文字,他們都將被顯示在遊戲視窗中。
需要指出,繪製文字采用了系統字型 Microsoft JhengHei,請確保系統已經安裝了該字型,否則輸入中文可能無法正常顯示。
# 匯入 key 模組和其他相關內容,並建立遊戲視窗和 Font 物件
from pygame import key, display, event, font, TEXTEDITING, TEXTINPUT, KEYDOWN, K_ESCAPE
w = display.set_mode((400, 300))
font.init()
f = font.SysFont('Microsoft JhengHei', size=30)
# 開啟輸入法(可以忽略 start_text_input 的呼叫)
key.start_text_input()
# 玩家輸入的文字
t = ''
# 玩家書寫的合成文字
c = ''
running = True
while running:
for e in event.get():
if e.type == KEYDOWN:
# 如果按下 Esc,則遊戲迴圈結束
if e.key == K_ESCAPE:
running = False
elif e.type == TEXTEDITING:
# 記錄玩家書寫的合成文字
c = e.text
print('編輯事件', e)
elif e.type == TEXTINPUT:
# 累計玩家輸入的文字
t += e.text
print('輸入事件', e)
# 將輸入文字,合成文字顯示在遊戲視窗中
w.fill('#000000')
sc = f.render(c, True, '#FF0000')
tc = f.render(t, True, '#00FF00')
w.blit(sc, (0, 0))
w.blit(tc, (0, 50))
display.flip()
關閉輸入法
key
模組的stop_text_input
函式,可用於關閉輸入法。
stop_text_input()
在下面的範例中,如果玩家按下Escape鍵,則關閉輸入法,如果按下Space鍵,則開啟輸入法。根據不同的輸入法和語言,Escape鍵可能需要按兩次才會生效,第一次為取消已經書寫的合成文字。
# 匯入 key 模組和其他相關內容,並建立遊戲視窗
from pygame import key, display, event, font, TEXTEDITING, TEXTINPUT, QUIT, KEYDOWN, K_SPACE, K_ESCAPE
display.set_mode((400, 300))
running = True
while running:
for e in event.get():
if e.type == QUIT:
running = False
elif e.type == KEYDOWN:
if e.key == K_SPACE:
# 如果按下空格鍵,則開啟輸入法
key.start_text_input()
print('開啟輸入法')
elif e.key == K_ESCAPE:
# 如果按下 Esc 鍵,則關閉輸入法
key.stop_text_input()
print('關閉輸入法')
elif e.type == TEXTEDITING:
print('編輯事件', e)
elif e.type == TEXTINPUT:
print('輸入事件', e)
設定輸入法候選視窗的顯示區域
key
模組的set_text_input_rect
函式,可用於設定輸入法候選視窗的顯示區域,如果輸入法提供候選視窗,並且支援顯示的話。
set_text_input_rect(rect)
- rect 參數
rect
參數是一個包含矩形資訊的物件,表示了候選視窗的顯示區域,該物件的書寫格式與Rect
物件的建構子的single_arg
參數類似。
矩形
關於Rect
建構子的single_arg
參數,你可以檢視Pygame 中的 Rect 物件一段。