如何在游戏中使用输入法进行文本输入
关注 1421
如何在 Pygame 中使用输入法输入文本视频演示 YouTube如何在 Pygame 中使用输入法输入文本视频演示 Bilibili
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 对象一段。