pygame 中的文本框
Textbox in pygame
我正在制作游戏。例如,在某些菜单中,当您创建个人资料时,我需要获取玩家输入的名称。问题是:如何?
我测试了多种技术,例如:
使用pygame.KEYDOWN
好的,它有效,但是 pygame.KEYDOWN
更新为 pygame.event.get()
。因此,由于游戏使用了大量资源,pygame 无法检测到大多数按下的键,因为它需要检测开始按下键的确切时刻。我试图减少计算量,但没有帮助。而且并不能真正解决问题。而且代码开始越来越难懂了。
我可以每一行更新按下的键,但是......没有人会认为它不会不可读。
使用pygame.key.get_pressed()
这个点是我认为工作会很好的轴。
我使用下面的技术来检测按键被按下的时刻(= 上一帧没有按下按键,但这一帧是)
但是这个解决方案有一个问题:Shift 键不受管理,所以你不能输入任何数字,或删除一个字符......(嗯,你可以,但我认为这取决于键盘使用,如果它是 AZERTY
或 QWERTY
并且它会非常扭曲并且很难在这个方向上编码)
prev_key_pressed = None
while conditions:
keys = pygame.key.get_pressed()
num_keys_pressed = 0
for key in range(len(keys)):
if keys[key]:
if prev_key_pressed != key: # if the key pressed last frame wasn't this key
text += chr(key)
num_keys_pressed += 1
prev_key_pressed = key
# if no key was pressed this frame
if not num_keys_pressed:
prev_key_pressed = None
最后,我想检测除 \
、/
或 .
之外的所有键,以避免明显的目录原因。
如果有人有想法帮助我,我将不胜感激。我搜索过 google 但我只找到了我已经知道的,或者我上面说的。
most of the keys pressed aren't detected by pygame, because it needs to detect the exact moment where a key begins to be pressed
没有。那不是真的。事件已排队。但是,pygame.event.get()
get all the messages and remove them from the queuepygame.event.get()
获取所有消息并将它们从队列中删除。请参阅文档:
This will get all the messages and remove them from the queue. [...]
如果在多个事件循环中调用pygame.event.get()
,则只有一个循环接收事件,而不是所有循环都接收所有事件。因此,有些事件似乎被遗漏了。
参见 。
您必须使用 KEYDOW
事件而不是 pygame.key.get_pressed()
。
pygame.key.get_pressed()
returns a list with the state of each key. If a key is held down, the state for the key is True
, otherwise False
. Use pygame.key.get_pressed()
评估按钮的当前状态并获得连续移动。
键盘事件(参见 pygame.event 模块)仅在键状态改变时发生一次。 KEYDOWN
事件在每次按下一个键时发生一次。 KEYUP
每松开一个键就会出现一次。将键盘事件用于单个操作。
while conditions:
# [...]
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
text += event.unicode
# [...]
我正在制作游戏。例如,在某些菜单中,当您创建个人资料时,我需要获取玩家输入的名称。问题是:如何?
我测试了多种技术,例如:
使用pygame.KEYDOWN
好的,它有效,但是 pygame.KEYDOWN
更新为 pygame.event.get()
。因此,由于游戏使用了大量资源,pygame 无法检测到大多数按下的键,因为它需要检测开始按下键的确切时刻。我试图减少计算量,但没有帮助。而且并不能真正解决问题。而且代码开始越来越难懂了。
我可以每一行更新按下的键,但是......没有人会认为它不会不可读。
使用pygame.key.get_pressed()
这个点是我认为工作会很好的轴。
我使用下面的技术来检测按键被按下的时刻(= 上一帧没有按下按键,但这一帧是)
但是这个解决方案有一个问题:Shift 键不受管理,所以你不能输入任何数字,或删除一个字符......(嗯,你可以,但我认为这取决于键盘使用,如果它是 AZERTY
或 QWERTY
并且它会非常扭曲并且很难在这个方向上编码)
prev_key_pressed = None
while conditions:
keys = pygame.key.get_pressed()
num_keys_pressed = 0
for key in range(len(keys)):
if keys[key]:
if prev_key_pressed != key: # if the key pressed last frame wasn't this key
text += chr(key)
num_keys_pressed += 1
prev_key_pressed = key
# if no key was pressed this frame
if not num_keys_pressed:
prev_key_pressed = None
最后,我想检测除 \
、/
或 .
之外的所有键,以避免明显的目录原因。
如果有人有想法帮助我,我将不胜感激。我搜索过 google 但我只找到了我已经知道的,或者我上面说的。
most of the keys pressed aren't detected by pygame, because it needs to detect the exact moment where a key begins to be pressed
没有。那不是真的。事件已排队。但是,pygame.event.get()
get all the messages and remove them from the queuepygame.event.get()
获取所有消息并将它们从队列中删除。请参阅文档:
This will get all the messages and remove them from the queue. [...]
如果在多个事件循环中调用pygame.event.get()
,则只有一个循环接收事件,而不是所有循环都接收所有事件。因此,有些事件似乎被遗漏了。
参见
您必须使用 KEYDOW
事件而不是 pygame.key.get_pressed()
。
pygame.key.get_pressed()
returns a list with the state of each key. If a key is held down, the state for the key is True
, otherwise False
. Use pygame.key.get_pressed()
评估按钮的当前状态并获得连续移动。
键盘事件(参见 pygame.event 模块)仅在键状态改变时发生一次。 KEYDOWN
事件在每次按下一个键时发生一次。 KEYUP
每松开一个键就会出现一次。将键盘事件用于单个操作。
while conditions:
# [...]
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
text += event.unicode
# [...]