【问题标题】:How can I make a sprite move when key is held down按住键时如何进行精灵移动
【发布时间】:2021-11-30 00:30:59
【问题描述】:

目前,每次按下一个键,精灵只会移动 1 个像素。按住左键或右键时,如何使水管工精灵不断移动?

while running:
    setup_background()
    spriteimg = plumberright

    screen.blit(spriteimg,(x1, y1))

    for event in pygame.event.get():
         if event.type == pygame.QUIT:
             running = False
         elif event.type == pygame.KEYDOWN:
             if event.key == pygame.K_UP:
                 x1 = x1 + 0
                 y1 = y1 - 1
             elif event.key == pygame.K_DOWN:
                 x1 = x1 + 0
                 y1 = y1 + 1
             elif event.key == pygame.K_LEFT:
                 x1 = x1 -1
                 y1 = y1 + 0
             elif event.key == pygame.K_RIGHT:
                 x1 = x1 + 1
                 y1 = y1 + 0

    pygame.display.flip()
    clock.tick(120)

【问题讨论】:

    标签: python pygame


    【解决方案1】:

    您可以使用pygame.key.get_pressed 来执行此操作。

    示例:

    while running:
        keys = pygame.key.get_pressed()  #checking pressed keys
        if keys[pygame.K_UP]:
            y1 -= 1
        if keys[pygame.K_DOWN]:
            y1 += 1
    

    【讨论】:

      【解决方案2】:

      键盘事件(参见pygame.event 模块)仅在按键状态更改时发生一次。每次按下某个键时,KEYDOWN 事件就会发生一次。每次释放键时,KEYUP 发生一次。将键盘事件用于单个操作或逐步移动。

      如果要实现连续运动,则必须使用pygame.key.get_pressed()pygame.key.get_pressed() 返回一个包含每个键状态的列表。如果按住某个键,则该键的状态为True,否则为False。使用pygame.key.get_pressed() 评估按钮的当前状态并获得连续移动:

      while running:
      
          for event in pygame.event.get():
               if event.type == pygame.QUIT:
                   running = False
      
          keys = pygame.key.get_pressed()
      
          x1 += keys[pygame.K_RIGHT] - keys[pygame.K_LEFT]
          y1 += keys[pygame.K_DOWN] - keys[pygame.K_UP]
      
          x1 = x1 % window.get_width()
          y1 = y1 % window.get_height()
      
          setup_background()
          spriteimg = plumberright
          screen.blit(spriteimg, (x1, y1))
      
          pygame.display.flip()
          clock.tick(120)
      

      另见Key and Keyboard event

      最小示例: repl.it/@Rabbid76/PyGame-ContinuousMovement

      import pygame
      
      pygame.init()
      window = pygame.display.set_mode((300, 300))
      clock = pygame.time.Clock()
      
      rect = pygame.Rect(0, 0, 20, 20)
      rect.center = window.get_rect().center
      vel = 5
      
      run = True
      while run:
          clock.tick(60)
          for event in pygame.event.get():
              if event.type == pygame.QUIT:
                  run = False
              if event.type == pygame.KEYDOWN:
                  print(pygame.key.name(event.key))
      
          keys = pygame.key.get_pressed()
          
          rect.x += (keys[pygame.K_RIGHT] - keys[pygame.K_LEFT]) * vel
          rect.y += (keys[pygame.K_DOWN] - keys[pygame.K_UP]) * vel
              
          rect.centerx = rect.centerx % window.get_width()
          rect.centery = rect.centery % window.get_height()
      
          window.fill(0)
          pygame.draw.rect(window, (255, 0, 0), rect)
          pygame.display.flip()
      
      pygame.quit()
      exit()
      

      【讨论】:

        【解决方案3】:

        使用这个伙伴,它会很好用,把它放在你的for循环中。

                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_a:
                        playerX_change = -0.1
                    if event.key == pygame.K_d:
                        playerX_change = 0.1
                if event.type == pygame.KEYUP:
                    if event.key == pygame.K_a or event.key == pygame.K_d:
                        playerX_change = 0
        
            playerX += playerX_change
            player(playerX, playerY)
            pygame.display.update()
        

        【讨论】:

          【解决方案4】:

          更简单的方法可以是: KEYDOWN 事件设置一个移动标志。 KEYUP 事件清除标志。 移动过程只需检查每一帧的标志。如果设置则移动,如果未设置则不移动。

          【讨论】:

          • 这比使用pygame.key.get_pressed要复杂得多,需要更多的代码
          • 欢迎来到 SO!请尽您所能回答所提出的问题。例如,通过为代码示例提供一些上下文。有关更多提示,请参阅stackoverflow.com/help/how-to-answer
          【解决方案5】:

          您可以使用 KEYUP 和 KEYDOWN 事件。 您可以在按键按下时连续执行任务,当按键向上时停止该任务

          for event in pygame.event.get():
              if event.type == pygame.KEYUP:
                  if event.key==K_DOWN:
                      print("down key is not pressed")
              elif event.type == pygame.KEYDOWN:
                  if event.key==K_DOWN:
                      print('down key is not pressed now')
              
              pygame.event.clear() #optional only if your code requires 
              #this will clear all event and the for loop will executed only once
          
          

          【讨论】:

            猜你喜欢
            相关资源
            最近更新 更多