es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo mover un personaje jugador cuando se mantiene presionada una tecla sin un retraso inicial.

Hola, estoy tratando de mover un personaje 1 píxel cada bucle mientras se mantiene presionado un botón.
Sin embargo, como Windows tiene un retraso incorporado al mantener presionada una tecla, simplemente usar un código como el siguiente no funciona. El código está destinado a dar una velocidad determinada mientras el personaje está en el suelo y una velocidad más lenta pero creciente si está en el aire.
He leído algunos comentarios sobre cómo “usar teclas para mover directamente al personaje” no es la forma correcta de resolver el problema. Sin embargo, no puedo averiguar cómo abordar esto.
¡Agradezco cualquier ayuda!

Pulsaciones de teclas:

keys = pygame.key.get_pressed()
if keys[pygame.K_a]:
    player.go_left()
if keys[pygame.K_d]:
    player.go_right()

Funciones de movimiento del personaje:

def go_left(self):
    if self.air == False:
        self.change_x = -5
    else:
        self.change_x -= 0.5
def go_right(self):
    if self.air == False:
        self.change_x = 5
    else:
        self.change_x += 0.5
Tags:  ,

Answer

  1. Avatar for davy.ai

    Una posible solución es utilizar el sistema de eventos de pygame en lugar de verificar las pulsaciones de teclas directamente. De esta manera, puedes capturar los eventos pygame.KEYDOWN y pygame.KEYUP para establecer una bandera que indique si las teclas están siendo presionadas o no, y luego utilizar esa bandera para mover continuamente al personaje en el bucle del juego.

    Aquí tienes un ejemplo de implementación:

    mover_izquierda = mover_derecha = False  # banderas que indican el estado de la tecla
    
    # bucle del juego
    while ejecutando:
      for evento in pygame.event.get():
        if evento.type == pygame.QUIT:
          ejecutando = False
        elif evento.type == pygame.KEYDOWN:
          if evento.key == pygame.K_a:
            mover_izquierda = True
          elif evento.key == pygame.K_d:
            mover_derecha = True
        elif evento.type == pygame.KEYUP:
          if evento.key == pygame.K_a:
            mover_izquierda = False
          elif evento.key == pygame.K_d:
            mover_derecha = False
    
      # mover jugador
      if mover_izquierda:
        jugador.ir_izquierda()
      elif mover_derecha:
        jugador.ir_derecha()
      else:
        jugador.detenerse()
    
      jugador.actualizar()
    
      # lógica y renderización del juego
      ...
    
    pygame.quit()
    

    En esta implementación, las banderas mover_izquierda y mover_derecha se establecen en True cuando se presionan las teclas respectivas, y se establecen en False cuando se sueltan. En el bucle del juego, las funciones de movimiento del jugador solo se llaman cuando las banderas son True, lo que simula efectivamente un movimiento continuo mientras las teclas están presionadas. La función jugador.detenerse() restablecería el atributo change_x a 0 cuando ninguna tecla esté siendo presionada. Puedes ajustar las velocidades de movimiento y otros parámetros según sea necesario para tu juego.

Comments are closed.