[Pygame] Problema para mostrar un grupo de sprites
gaffeur -
Hola,
Empiezo en Python y me gustaría poder hacer mis propios juegos con Pygame.
En mi programa, cuando intento mostrar mi grupo de sprites, no funciona y no sé por qué.
Aquí está mi código:
import pygame pygame.init() background = pygame.image.load("PygameAssets-main/bg.jpg") ecran = pygame.display.set_mode((1080, 720)) joueur = pygame.image.load("PygameAssets-main/player.png") x = 400 y = 450 ecran.blit(joueur, (x, y)) velocity = 5 pygame.key.set_repeat(4,20) class projectile(pygame.sprite.Sprite): def __init__(self): super().__init__() self.image = pygame.image.load("PygameAssets-main/projectile.png") self.rect = self.image.get_rect() running = True v = 0 while running == True: projectilegroup = pygame.sprite.Group() def launch(): global v v += 1 print(v) projectilegroup.add(projectile()) ecran.blit(background, (0, -250)) projectilegroup.draw(ecran) ecran.blit(joueur, (x,y)) for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.KEYDOWN: if event.key == pygame.K_RIGHT and x < 915: x += velocity elif event.key == pygame.K_LEFT and x > -30: x -= velocity elif event.key == pygame.K_SPACE: print(event.key) launch() pygame.display.update() pygame.quit() Merci de me répondre.
1 respuesta
-
Buenas noches, el problema es que declaras a cada ciclo de tu bucle tu grupo de sprites, lo mismo ocurre con tu función launch, no debe estar dentro de tu bucle. Lo que debe ocurrir, grosso modo, en tu código, es que el jugador dispare, se cree un nuevo proyectil, su posición debe desplazarse automáticamente en una dirección dada, deberá ser destruido en caso de encontrarse con algún obstáculo o si sale de la pantalla. Este desplazamiento lo puedes hacer en tu clase Projectile modificando la coordenada del rectángulo, y una ventaja de usar los grupos es entre otras cosas poder hacer un update del grupo, lo cual actualizará automáticamente cada sprite del grupo; podemos aprovecharlo aquí usando el método update para mover los proyectiles. Prefiere usar pygame.key.get_pressed() en lugar de pygame.key.set_repeat(), eso tendrá la ventaja de poder usar varias teclas del teclado simultáneamente. También es sensato regular el FPS del juego utilizando pygame.time.Clock(). He preferido que la clase proyectil gestione ella misma sus grupos. Aquí tienes un poco de cómo quedaría siguiendo estas indicaciones; al no tener imágenes, he modificado un poco para hacer un simple ejemplo reproducible, cuando puedas repones el código de tus imágenes.
import pygame FPS = 60 PLAYER_VELOCITY = 3 FIRE_DELAY = 150 # delay entre disparos en ms SCREEN_WIDTH = 1080 SCREEN_HEIGHT = 720 pygame.init() ecran = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) # background= pygame.image.load("PygameAssets-main/bg.jpg") background = pygame.Surface((SCREEN_WIDTH, SCREEN_HEIGHT)).convert_alpha() background.fill(pygame.Color('black')) # jugador = pygame.image.load("PygameAssets-main/player.png") joueur = pygame.Surface((50, 20)).convert_alpha() joueur.fill(pygame.Color('blue')) projectile_group = pygame.sprite.Group() x = 400 y = 450 class projectile(pygame.sprite.Sprite): speed = 12 def __init__(self, x, y, group): super().__init__() group.add(self) self.group = group # self.image = pygame.image.load("PygameAssets-main/projectile.png") self.image = pygame.Surface((25, 5)).convert_alpha() self.image.fill(pygame.Color('yellow')) self.rect = self.image.get_rect() self.rect.topleft = x, y def update(self): self.rect.x += self.speed if self.rect.x > SCREEN_WIDTH: self.group.remove(self) clock = pygame.time.Clock() running = True fire_last_time = 0 while running: ecran.blit(background, (0, -250)) # desplazamiento de los proyectiles projectile_group.update() projectile_group.draw(ecran) ecran.blit(joueur, (x, y)) for event in pygame.event.get(): if event.type == pygame.QUIT: running = False keys = pygame.key.get_pressed() if keys[pygame.K_RIGHT] and x < SCREEN_WIDTH - joueur.get_width(): x += PLAYER_VELOCITY if keys[pygame.K_LEFT] and x > 0: x -= PLAYER_VELOCITY if keys[pygame.K_SPACE] and fire_last_time + FIRE_DELAY < pygame.time.get_ticks(): projectile(x + joueur.get_width(), y, projectile_group) fire_last_time = pygame.time.get_ticks() pygame.display.update() clock.tick(FPS) pygame.quit()Il y a évidemment beaucoup de choses à modifier: la position verticale du projectile, la direction; si le joueur va vers la gauche, le projectile sera donc tiré dans cette même direction.