0

Trying to make a function that allows me to summon more enemies whenever I press a key, currently I have tried summoning more and it works but they all spawn in the same tile. I am using the pygame.sprite.Group() in order to group all the enemies with their sprites.

I have tried to make a function that summons enemies by looping through the enemy class Here's my code:

import pygame, sys
import os
import math
import random

# Variables
clock = pygame.time.Clock()

mMenu_color = (0, 0, 0)
anicycle_idle = 10
anicycle = 6

# Sprite locations P being player E being enemy and B being background
PSL = 'sprites/player_sprites/'
ESL = 'sprites/enemy_sprites/'
BSL = 'sprites/background_sprites/'


# Set screen size based of 16:9 ratio 
full_display = pygame.display.set_mode()
x, y = full_display.get_size()
x /= 16
y/= 9
if x != y:
    ratio_x, ratio_y = 16, 9
    display_w, display_h = (ratio_x * 120), (ratio_y * 120)
else:
    display_w, display_h = (x*16), (y*9)
display = pygame.display.set_mode((display_w, display_h))


# Game Data
background_img = pygame.image.load(os.path.join(f'{BSL}', 'background_piece.png')).convert()
background_img.set_colorkey((0, 255, 0))



# Classes
class Player(pygame.sprite.Sprite):
    
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.movex = 0
        self.movey = 0
        self.frame = 0
        self.idle_frame = 0
        self.health = 10
        
        self.images_idle = []
        self.images_walking = []
        for i in range(anicycle_idle):
            player_image = pygame.image.load(os.path.join(f'{PSL}idle_animation', f'playersprite{str(i)}.png')).convert()
            player_image.set_colorkey((0, 255, 0))
            self.size = player_image.get_size()
            player_image = pygame.transform.scale(player_image, (int(self.size[0]*2), int(self.size[1]*2)))
            self.images_idle.append(player_image)
            self.image = self.images_idle[0]
            self.rect = self.image.get_rect()
            
        for i in range(anicycle):
            player_image = pygame.image.load(os.path.join(f'{PSL}walking_animation', f'playersprite{str(i)}.png')).convert()
            player_image.set_colorkey((0, 255, 0))
            self.size = player_image.get_size()
            player_image = pygame.transform.scale(player_image, (int(self.size[0]*2), int(self.size[1]*2)))
            self.images_walking.append(player_image)
        self.image = pygame.transform.flip(self.image, True, False)
        self.image_direction = "Right"
        self.center = (32, 32)
        
            
    def control(self, x, y):
        self.movex += x
        self.movey += y
          
    def update(self):
        # Idle animation
        self.center = self.rect.center
        if self.movex == 0 and self.movey == 0:
            self.idle_frame += 0.1
            if self.idle_frame >= anicycle_idle:
                self.idle_frame = 0
            self.image = self.images_idle[int(self.idle_frame)]
        
        # Animation Based on direction
        self.frame += 0.25
        if self.frame >= len(self.images_walking):
            self.frame = 0
        if self.movex != 0:
            if self.movex < 0:
                self.image_direction = "Left"
                self.image = self.images_walking[int(self.frame)]
            if self.movex > 0:
                self.image_direction = "Right"
                self.image = pygame.transform.flip(self.images_walking[int(self.frame)], True, False)
        if self.movey != 0:
            if self.image_direction == "Right":
                self.image = pygame.transform.flip(self.images_walking[int(self.frame)], True, False)
            else:
                self.image = self.images_walking[int(self.frame)]
                
        # Stops player from leaving game border
        self.rect.x += self.movex
        if self.rect.right >= display_w or self.rect.left <= 0:
            self.rect.x -= self.movex
        self.rect.y += self.movey
        if self.rect.top <= 0 or self.rect.bottom >= display_h:
            self.rect.y -= self.movey
        
        
        
        self.player_position = [self.rect.x, self.rect.y]
        

class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)    
        self.speed = 3  
        self.health = 1    
        self.images = []
        self.frame = 0
        self.death_images = []
        self.death = False
        self.death_frame = 0
        for i in range(5):
            enemy_image = pygame.image.load(os.path.join(f'{ESL}/enemy_animation', f'enemysprite{i}.png')).convert()
            enemy_image.set_colorkey((0, 255, 0))
            self.size = enemy_image.get_size()
            enemy_image = pygame.transform.scale(enemy_image, (int(self.size[0]*2), int(self.size[1]*2)))
            self.images.append(enemy_image)
            self.image = self.images[0]
            self.rect = self.image.get_rect()
            self.direction = "Right"
        for i in range(7):
            enemy_image = pygame.image.load(os.path.join(f'{ESL}/enemy_die', f'enemysprite{i+1}.png')).convert()
            enemy_image.set_colorkey((0, 255, 0))
            self.size = enemy_image.get_size()
            enemy_image = pygame.transform.scale(enemy_image, (int(self.size[0]*2), int(self.size[0]*2)))
            self.death_images.append(enemy_image)
        
    def check_collision(self, bullet_pos):
        collided = False
        if self.rect.left <= bullet_pos[0] <= self.rect.right and self.rect.bottom >= bullet_pos[1] >= self.rect.top:
                
                print("Hit")
                collided = True
                
        if collided == True:
            self.health -= 1
                
                
                
        return collided, self.health
    
    def die(self):
        for enemy in enemy_list:
            if self.health <= 0:
                self.death = True
                

    
    def update(self):
        
        if self.death == True:
            self.death_frame += 0.1
            if self.death_frame >= len(self.death_images):
                self.death == False
                self.death_frame = 0
                enemy_list.remove(enemy)
            self.image = self.death_images[int(self.death_frame)]
            
        else:
            self.frame += 0.1
            if self.frame >= len(self.images):
                self.frame = 0        
            
            if player.rect.x > self.rect.x:
                self.rect.x += self.speed
                self.image = self.images[int(self.frame)]
                self.direction = "Right"
            elif player.rect.x < self.rect.x:
                self.image = pygame.transform.flip(self.images[int(self.frame)], True, False)
                self.direction = "Left"
                self.rect.x -= self.speed
            if player.rect.y < self.rect.y:
                self.rect.y -= self.speed
                if self.direction == "Left":
                    self.image = pygame.transform.flip(self.images[int(self.frame)], True, False)
                else:
                    self.image = self.images[int(self.frame)]
            elif player.rect.y > self.rect.y:
                self.rect.y += self.speed
                if self.direction == "Left":
                    self.image = pygame.transform.flip(self.images[int(self.frame)], True, False)
                else:
                    self.image = self.images[int(self.frame)]
        


# Pre-game
enemy = Enemy()
enemy.rect.x = 100
enemy.rect.y = 100
enemy_list = pygame.sprite.Group()
enemy_list.add(enemy)



player = Player()
player.rect.x = 0
player.rect.y = 0
player_list = pygame.sprite.Group()
player_list.add(player)
movement = 4 



# Game Functions

def main():
    all_bullets = []    
    while True:
        start = pygame.math.Vector2(player.center)
        end = start
        length = 50

        bullet_velo = 20
                
                
        display.fill(mMenu_color)
        display.blit(background_img, (0, 0))
        
        
        
            
            
        # Event Loops
        for event in pygame.event.get():
            # Quit
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
                
                
                
            if event.type == pygame.MOUSEBUTTONDOWN:
                mouse = pygame.mouse.get_pos()
                
                distance = mouse - start
                
                position = pygame.math.Vector2(start)
                speed = distance.normalize() * bullet_velo

                all_bullets.append([position, speed])

                
            if event.type == pygame.KEYDOWN:
                if event.key == ord('q'):
                    pygame.quit()
                # Movement
                if event.key == ord('a'):
                    player.control(-movement, 0)
                if event.key == ord('d'):
                    player.control(movement, 0)
                if event.key == ord('w'):  
                    player.control(0, -movement)
                if  event.key == ord('s'):
                    player.control(0, movement)
                if event.key == ord('h'):
                    z = random.randint(1,5)
                    Level.bad(z)
                    
            if event.type == pygame.KEYUP:
                if event.key == ord('a'):
                    player.control(movement, 0)
                if event.key == ord('d'):
                    player.control(-movement, 0)
                if event.key == ord('w'):  
                    player.control(0, movement)
                if  event.key == ord('s'):
                    player.control(0, -movement)
                
                
        mouse = pygame.mouse.get_pos()
        end = start + (mouse - start).normalize() * length
        
        for position, speed in all_bullets:
            position += speed
        box = pygame.draw.rect(display, (255, 255 ,255), pygame.Rect(300, 300, 50, 50))
        player.update()
        player_list.draw(display)
        print(enemy_list)
        enemy_list.draw(display)
        enemy.update()
        pygame.draw.line(display, (255, 0, 0), start, end)
        
        for position, speed in all_bullets:
            pos_x = int(position.x)
            pos_y = int(position.y)
            bullet = pygame.draw.circle(display, (0, 255, 0), (pos_x, pos_y), 6, 5)
            
            bullet_pos = [bullet.x, bullet.y]
            
            collided, enemy_health = enemy.check_collision(bullet_pos)
            if collided == True:
                if enemy_health > 0:
                    enemy.damage()
                else:
                    enemy.die()
                print("Enemy Killed")
            
            
                

        pygame.display.update()
        clock.tick(60)
        

        
if __name__ == '__main__':
    main()
  • I don't see where you crate more objects `Enemy()` and where you set different positions for new objects. And this can be your problem - you create only one `Enemy`. – furas Oct 26 '22 at 13:33

0 Answers0