【问题标题】:PyGame frame rate with keyboard input带键盘输入的 PyGame 帧速率
【发布时间】:2017-09-30 09:35:22
【问题描述】:

使用 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)

【问题讨论】:

    标签: python pygame


    【解决方案1】:

    不要检查键的状态(无论它是否被按住),而是检查它何时被按下或重新释放。可以通过保存键之前的状态并检查其状态是否已更改,或使用事件循环来完成。

    使用键状态:

    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
    

    【讨论】:

      猜你喜欢
      • 2021-05-17
      • 1970-01-01
      • 2019-05-27
      • 2016-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-16
      • 2021-10-10
      相关资源
      最近更新 更多