Python Pygame键关闭不工作

Python Pygame键关闭不工作,python,pygame,Python,Pygame,我试图使一个矩形在屏幕上上上下移动。但是当我按下键使它向上或向下移动时,我每次都必须不断地按下它使它移动。我解释pygame.KEYDOWN的方式是,我可以按住所需的键,矩形将移动,直到我释放键为止 按下键的代码: while True: for event in pygame.event.get(): # all keys keys = pygame.key.get_pressed() # quit game if eve

我试图使一个矩形在屏幕上上上下移动。但是当我按下键使它向上或向下移动时,我每次都必须不断地按下它使它移动。我解释pygame.KEYDOWN的方式是,我可以按住所需的键,矩形将移动,直到我释放键为止

按下键的代码:

while True:
    for event in pygame.event.get():
        # all keys
        keys = pygame.key.get_pressed()
        # quit game
        if event.type == pygame.QUIT or keys[pygame.K_ESCAPE]:
            pygame.quit()
            quit()

        # check key down presses
        elif event.type == pygame.KEYDOWN:
            # left paddle
            if keys[pygame.K_q]:
                left.move(-30)
            if keys[pygame.K_a]:
                left.move(30)

            # right paddle
            if keys[pygame.K_p]:
                right.move(-30)
            if keys[pygame.K_l]:
                right.move(30)

        # user let up on a key
        elif event.type == pygame.KEYUP:
            if event.key == keys[pygame.K_q] or event.key == keys[pygame.K_a]:
                left.move(0)
            elif event.key == pygame.K_p or event.key == pygame.K_l:
                right.move(0)

    # call animation function
    draw()

    # FPS
    clock.tick(120)
left
right
对象来自以下类:

import pygame


class Paddle:

    def __init__(self, screen, h, w, left):
        self.screen = screen
        self.width = w
        self.y = h / 2
        self.pad_width = 10
        self.pad_height = 70

        if left:
            self.x = self.pad_width / 2
        else:
            self.x = self.width - self.pad_width * 1.5

    def show(self):
        WHITE = (255, 255, 255)
        rect = pygame.Rect(self.x, self.y, self.pad_width, self.pad_height)
        pygame.draw.rect(self.screen, WHITE, rect)

    def move(self, speed):
        self.y += speed

游戏循环应包括三个主要步骤:

  • 处理用户输入
  • 更新游戏状态
  • 重新渲染场景
  • 我认为,通过一起执行步骤1和步骤2,您可能会有点困惑自己

    首先,
    KEYDOWN
    检测到按键被按下,而不是被按下。因此,我建议跟踪当前的关键状态,作为一个基本示例:

    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_q:
            q_down = True
    else:
        if event.key == pygame.K_q:
            q_down = False
    
    现在已处理用户输入,您只需使用:

    if q_down: left.move(-30)
    
    在游戏循环中更新游戏状态(注意这应该在事件循环之外)



    我还建议您阅读游戏开发SE,并查看链接的资源,以更好地了解游戏循环。

    KEYDOWN
    检测按键是否按下。您应该检测
    KEYDOWN
    keydup
    并跟踪每个键的当前状态(提示,在所有情况下使用
    event.key
    ,而不是
    )@NickA我将事件更改为
    if event.key==pygame.K_q:
    等。但我仍然需要每次按下该键使其移动。您需要保持当前键状态
    q_down=True/False
    ,这取决于它是否刚刚按下/释放,然后在游戏循环中,您可以执行
    if q_down:left.move(-30)
    (注意我说的是在你的游戏循环中,而不是事件处理循环中)@NickA gotcha,谢谢。似乎起作用了。当我可以访问计算机而不是手机时,我会写一个正确的完整答案,直到那时我才写一个简短的答案