0

I am creating a game similar to space invaders in pygame. My source code:

#main.py

import pygame as pg
import sys
import math
import random
from enemy import *
from spaceship import Spaceship
from bullet import Bullet
from background import Background


class Game:
    def run(self):
        # Draw all sprite groups
        bg_group.draw(screen)
        bullet_group.draw(screen)
        spaceship_group.draw(screen)
        enemies_group.draw(screen)

        # Update all sprite groups
        bg_group.update()
        bullet_group.update()
        spaceship_group.update()
        enemies_group.update()

        # Collision
        for bullet in bullet_group:
            if pg.sprite.spritecollide(bullet, enemies_group, False):
                new_enemy.enemy_get_damage(20)
        for enemy in enemies_group:
            if new_enemy.health == 0:
                enemy.enemy_destroy()


if __name__ == "__main__":
    # General setup
    global screen
    pg.init()
    screen = pg.display.set_mode((800, 600))
    pg.display.set_caption("Space Invaders")
    pg.mouse.set_visible(False)
    clock = pg.time.Clock()
    game = Game()

    # create the display surface
    #global GameScreen
    #GameScreen = pygame.display.Info()
    #screen = pygame.display.set_mode((GameScreen.current_w,GameScreen.current_h))


    # Background
    bg = Background('images\\SpaceBg\\Backgrounds\\Blue3_YellowStars_1080p.png')
    bg_group = pg.sprite.GroupSingle()
    bg_group.add(bg)

    # Spaceship
    spaceship = Spaceship('images\\space-invaders_player.png')
    spaceship_group = pg.sprite.GroupSingle()
    spaceship_group.add(spaceship)

    # Bullet
    bullet_group = pg.sprite.Group()
    #bullet_group.add(Bullet(spaceship.rect.center,5))

    # Enemies
    enemies_group = pygame.sprite.Group()
    for enemy in range(15):
        new_enemy = Enemy(random.randrange(0, 737), random.randrange(50, 150), 140)
        enemies_group.add(new_enemy)



    while True:
        for event in pg.event.get():
            if event.type == pg.KEYDOWN:
                if event.key == pg.K_ESCAPE:
                    pg.quit()
                    sys.exit()
            if event.type == pg.MOUSEBUTTONDOWN:
                #if event.button == 1:
                bullet_group.add(spaceship.Shoot())
        game.run()
        pg.display.flip()
        clock.tick(360)


For enemy sprites I created a file with class Enemy.

#enemy.py

import main
import pygame
from main import *
from bullet import Bullet

class Enemy(pygame.sprite.Sprite):
    def __init__(self, pos_x, pos_y, health):
        super().__init__()

        self.speed_x = 1
        self.sprites = []
        self.destroy = []
        self.health = health
        self.max_health = health + 500
        self.healthBar_length = 300
        self.health_ratio = self.max_health / self.healthBar_length
        self.sprites.append(pygame.image.load('images\\enemies\\green_enemy\\enemy-1.png').convert_alpha())
        self.sprites.append(pygame.image.load('images\\enemies\\green_enemy\\enemy-2.png').convert_alpha())
        self.sprites.append(pygame.image.load('images\\enemies\\green_enemy\\enemy-3.png').convert_alpha())
        self.sprites.append(pygame.image.load('images\\enemies\\green_enemy\\enemy-4.png').convert_alpha())
        self.destroy.append(pygame.image.load('images\\enemies\\green_enemy\\enemy-destroy-1.png').convert_alpha())
        self.destroy.append(pygame.image.load('images\\enemies\\green_enemy\\enemy-destroy-2.png').convert_alpha())
        self.destroy.append(pygame.image.load('images\\enemies\\green_enemy\\enemy-destroy-3.png').convert_alpha())
        self.destroy.append(pygame.image.load('images\\enemies\\green_enemy\\enemy-destroy-4.png').convert_alpha())
        self.current_sprite = 0
        self.current_destroy_sprite = 0
        self.image = self.sprites[self.current_sprite]
        self.image_destroy = self.destroy[self.current_destroy_sprite]
        self.rect = self.image.get_rect()
        self.rect_destroy = self.image_destroy.get_rect()
        self.rect.center = [pos_x, pos_y]
        self.rect_destroy.center = [pos_x, pos_y]

    def basic_health(self):
        pygame.draw.rect(self.image, (255, 0, 0), (0, 0,self.health,3))
        pygame.draw.rect(self.image, (0, 255, 0), (0, 0,self.health/self.health_ratio,3))

    def enemy_get_damage(self, damage_amount):
        if self.health > 0:
            self.health -= damage_amount

    # Enemy sprite movment vertical
    def enemy_movement(self):
        self.current_sprite += 0.08
        if self.current_sprite >= len(self.sprites):
            self.current_sprite = 0
        self.image = self.sprites[int(self.current_sprite)]

        # Enemy sprite movment horizontal
        if self.speed_x > 0:
            if self.rect.right + self.speed_x <= 810:
                self.rect.x += self.speed_x
            else:
                self.speed_x = self.speed_x * -1
        else:
            if self.rect.x - self.speed_x >= -9:
                self.rect.x += self.speed_x
            else:
                self.speed_x = self.speed_x * -1

    # Enemy destroy animation
    def enemy_destroy(self):
        if self.health <= 0:
            self.current_destroy_sprite += 0.08
            if self.current_destroy_sprite >= len(self.destroy):
                self.current_destroy_sprite = 0
                self.kill()
            self.image = self.destroy[int(self.current_destroy_sprite)]


    def update(self):
        self.enemy_movement()
        self.enemy_destroy()
        self.basic_health()

I'm having trouble destroying enemies individually in sprite.Group().I have a collision mechanic created between the projectile and the enemy,

 # Collision
        for bullet in bullet_group:
            if pg.sprite.spritecollide(bullet, enemies_group, False):
                new_enemy.enemy_get_damage(20)
                bullet.kill()
        for enemy in enemies_group:
            if new_enemy.health == 0:
                enemy.enemy_destroy()

but when I shoot enemies, only one sprite from the whole group reacts to the projectiles (its life bar decreases and when the life bar is empty the destruction animation starts).

I'm stuck at this point and don't know how to get out of it...

Any ideas what is wrong with my code?

mati14205
  • 1
  • 1

0 Answers0