带键盘输入的PyGame帧率

时间:2017-05-02 18:42:58

标签: python pygame

使用PyGame,我想创建一个移动的方块,它在网格中移动,由键盘按下箭头控制。因此,按“向上”键将方块直接向上移动到单元格,按“右”键将方块直接移动到右边的单元格等。

在我的循环中,我使用pygame.time.wait(x)暂停x毫秒。但是,选择x的正确值证明是困难的。如果x太大(例如1000),则广场不会立即响应,我实际上必须按住键才能让它移动。但是如果x太小(例如10),那么只要按一个键,方块就会连续移动几次。但我只想让广场在每次按键时移动一次。我怎样才能做到这一点?谢谢!

以下是我的代码的重要部分:

    x = 100
    current_pos = [0, 0]

    while True:

        pygame.event.pump()  # process event queue
        is_key_pressed = pygame.key.get_pressed()

        if is_key_pressed[pygame.K_UP]:
            current_pos[1] -= 1

        elif is_key_pressed[pygame.K_RIGHT]:
            current_pos[0] += 1

        elif is_key_pressed[pygame.K_DOWN]:
            current_pos[1] += 1

        elif is_key_pressed[pygame.K_LEFT]:
            current_pos[0] -= 1

        show_map(current_pos)

        pygame.time.wait(x)

1 个答案:

答案 0 :(得分:2)

不是检查密钥的状态(是否保持密钥),而是检查按下或重新按下的时间。可以通过保存密钥先前状态并检查其状态是否已更改,或使用事件循环来完成。

使用关键状态:

was_pressed = pygame.key.get_pressed()

while True:
    pygame.event.pump()  # process event queue
    key_is_pressed = pygame.key.get_pressed()

    if key_is_pressed[pygame.K_UP] and not was_pressed[pygame.K_UP]:
        current_pos[1] -= 1

    elif key_is_pressed[pygame.K_RIGHT] and not was_pressed[pygame.K_RIGHT]:
        current_pos[0] += 1

    elif key_is_pressed[pygame.K_DOWN] and not was_pressed[pygame.K_DOWN]:
        current_pos[1] += 1

    elif key_is_pressed[pygame.K_LEFT] and not was_pressed[pygame.K_LEFT]:
        current_pos[0] -= 1

    was_pressed = key_is_pressed

使用事件循环:

while True:
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                current_pos[1] -= 1
            elif event.key == pygame.K_UP:
                current_pos[0] += 1
            elif event.key == pygame.K_DOWN:
                current_pos[1] += 1
            elif event.key == pygame.K_LEFT:
                current_pos[0] -= 1