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?