pygame 中的文本框

Textbox in pygame

我正在制作游戏。例如,在某些菜单中,当您创建个人资料时,我需要获取玩家输入的名称。问题是:如何?

我测试了多种技术,例如:

使用pygame.KEYDOWN 好的,它有效,但是 pygame.KEYDOWN 更新为 pygame.event.get()。因此,由于游戏使用了大量资源,pygame 无法检测到大多数按下的键,因为它需要检测开始按下键的确切时刻。我试图减少计算量,但没有帮助。而且并不能真正解决问题。而且代码开始越来越难懂了。

我可以每一行更新按下的键,但是......没有人会认为它不会不可读。

使用pygame.key.get_pressed() 这个点是我认为工作会很好的轴。

我使用下面的技术来检测按键被按下的时刻(= 上一帧没有按下按键,但这一帧是)

但是这个解决方案有一个问题:Shift 键不受管理,所以你不能输入任何数字,或删除一个字符......(嗯,你可以,但我认为这取决于键盘使用,如果它是 AZERTYQWERTY 并且它会非常扭曲并且很难在这个方向上编码)

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

    # [...]