¿Cómo puedo mover mi objeto en pygame presionando el botón?

Intenté usar algo como esto pero no funcionó.

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

Aquí está el código que tengo en este momento. Intenté usar un método diferente porque el método anterior no funcionó para mí. Se mueve un solo toque a la vez.

 import pygame spaceX = 100 spaceY = 100 pygame.init black = (0,0,0) size = (800, 800) screen = pygame.display.set_mode(size) def game(spaceX, spaceY): spaceship_file = 'spaceship.png' spaceship_image = pygame.image.load(spaceship_file) spaceship = pygame.transform.scale(spaceship_image, (30, 30)) screen.fill(black) screen.blit(spaceship, (spaceX, spaceY)) pygame.display.flip() while True: for event2 in pygame.event.get(): if event2.type == pygame.KEYDOWN and event2.key == pygame.K_LEFT: spaceX2 = spaceX - 5 game(spaceX2, spaceY) elif event2.type == pygame.KEYDOWN and event2.key == pygame.K_RIGHT: spaceX2 = spaceX + 5 game(spaceX2, spaceY) game(spaceX, spaceY) 

EDITAR:

Tengo este código ahora. Mi objeto todavía se mueve solo cuando toco repetidamente el botón y no cuando lo mantengo presionado.

 def game(spaceX, spaceY): while True: screen.fill(black) screen.blit(spaceship, (spaceX, spaceY)) pygame.display.flip() keys = pygame.key.get_pressed() for event in pygame.event.get(): if keys[pygame.K_LEFT]: spaceX = spaceX - 5 game(spaceX, spaceY) elif keys[pygame.K_RIGHT]: spaceX = spaceX + 5 game(spaceX, spaceY) 

Hay dos formas de verificar la entrada clave, ya sea si están en la cola de eventos o verificando su estado actual.

Cola de eventos

Las claves se colocan en la cola de eventos cuando se presionan o se muestran, por lo que no se puede saber directamente si una clave se mantiene o no. Hay dos maneras de evitar esto:

  1. Llame a pygame.key.set_repeat(True) antes de ingresar al bucle principal. Esto colocará repetidamente el evento KEYDOWN en la cola de eventos, siempre que se mantenga.

  2. Introducir una variable de velocidad. Ajuste la velocidad a cierta velocidad cuando el usuario presione la tecla hacia abajo y establezca la velocidad en 0 cuando el usuario levante la tecla.

Por ejemplo:

 for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: velocity_x = -5 elif event.key == pygame.K_RIGHT: velocity_x = 5 elif event.type == pygame.KEYUP: if event.key == pygame.K_LEFT: velocity_x = 0 elif event.key == pygame.K_RIGHT: velocity_x = 0 position_x += velocity_x 

Comprobación del estado

pygame.key.get_pressed() el estado actual de las claves llamando a pygame.key.get_pressed() . pygame.event llamar a una de las funciones en pygame.event para que pygame realice algunas acciones internas necesarias, así que use pygame.event.pump() si no desea usar la cola de eventos. Tu sistema operativo pensará que Pygame se ha estrellado si no lo haces, lo que provocará que el juego no responda. Aunque, por lo general, desea controlar el evento pygame.QUIT , para que el usuario pueda salir.

 pygame.event.pump() keys = pygame.key.get_pressed() if keys[pygame.K_LEFT]: position_x -= 5 elif keys[pygame.K_RIGHT]: position_x += 5 

Una solución a este problema sería usar la función set_repeat

 pygame.key.set_repeat(True) 

Esto generará múltiples eventos KEYDOWN .

Intenta agregar las claves a tu pygame para loop. Entonces debería verse algo como esto …

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