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.

Problema al añadir explosiones a Space Invaders

Hola, soy nuevo en Python y como mi primer proyecto decidí hacer un juego de Space Invaders. Mi problema es que, cuando derribo una columna de alienígenas, las explosiones aparecen en el mismo lugar específico para esa columna.

Por ejemplo, las explosiones para la columna más a la izquierda aparecen en la parte superior izquierda de la pantalla, y a medida que te mueves hacia las columnas de la derecha, las explosiones van hacia abajo, tanto que las animaciones de explosión para la columna más a la derecha aparecen en la parte inferior derecha de la pantalla.

Incluiré el código de la clase Explosiones que hice y la parte del archivo de funciones en la que creo que he escrito el código que causa este problema.

La clase Explosión:

import pygame

pygame.init()

clock = pygame.time.Clock()
fps = 60

class Explosion(pygame.sprite.Sprite):
    def __init__(self, x, y, size):
        pygame.sprite.Sprite.__init__(self)
        self.images = []
        for num in range(1, 6):
            img = pygame.image.load(f"images/exp{num}.png")
            if size == 1:
                img = pygame.transform.scale(img, (20, 20))
            if size == 2:
                img = pygame.transform.scale(img, (40, 40))
            if size == 3:
                img = pygame.transform.scale(img, (160, 160))
            # add the image to the list
            self.images.append(img)
        self.index = 0
        self.image = self.images[self.index]
        self.rect = self.image.get_rect()
        self.rect.center = [x, y]
        self.counter = 0

def update(self):
    explosion_speed = 4
    # Update explosion animation.
    self.counter += 1

    if self.counter >= explosion_speed and self.index < len(self.images) - 1:
        self.counter = 0
        self.index += 1
        self.image = self.images[self.index]

    # If the animation is complete, delete explosion.
    if self.index >= len(self.images) - 1 and self.counter >= explosion_speed:
        self.kill()

La sección que posiblemente está causando problemas:

def check_bullet_alien_collisions(ai_settings, screen, stats, sb, ship, aliens,
                                  bullets, ai_sounds, explosions):
    """Respond to bullet-alien collisions."""
    # Remove the bullets that have collided.
    collisions = pygame.sprite.groupcollide(aliens, bullets, True, True)
    for alien in collisions:
        explosion = Explosion(alien.rect.centerx, alien.rect.centery, 2)
        explosions.add(explosion)

    if collisions:
        for alienss in collisions.values():
            stats.score += ai_settings.alien_points * len(alienss)
            ai_sounds.play_alien_explosion_sound()
        sb.prep_score()
        check_high_score(stats, sb)
    if len(aliens) == 0:
        start_new_level(ai_settings, screen, stats, sb, ship, aliens, bullets)
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está en la línea que crea la instancia de la clase Explosion:

    explosion = Explosion(alienn.rect.centerx, alienn.rect.centerx, 2)

    Parece que estás estableciendo la posición x e y de la explosión para que sean la misma coordenada centerx. Esto haría que las explosiones se apilaran una encima de la otra en una columna.

    Para solucionar esto, debes establecer la posición y en la coordenada center y del alienígena:

    explosion = Explosion(alienn.rect.centerx, alienn.rect.centery, 2)

    Esto debería hacer que las explosiones aparezcan en la ubicación correcta en relación con la columna de alienígenas.

Comments are closed.