How do I add a new enemy every 5 seconds in Pygame

Question:

I am currently creating a top-down shooter game in pygame and need a new enemy to spawn every 5 seconds. I am fairly new to coding and have looked at a few different tutorials but none of which have helped me. Here is a bit of my code. If you need to look at the whole code just ask me.

Thanks!

#Enemy classes

class Enemy1(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.hit_box = (self.x-10, self.y -10, 70, 70)
        self.animation_images = [pygame.image.load("Enemy1_animation_0.png"), pygame.image.load("Enemy1_animation_1.png"),
        pygame.image.load("Enemy1_animation_2.png"), pygame.image.load("Enemy1_animation_3.png")]
        self.animation_count = 0
        self.reset_offset = 0
        self.offset_x = random.randrange(-150, 150)
        self.offset_y = random.randrange(-150, 150)
        self.health = 4


    def main(self, display):
        if self.animation_count + 1 == 16:
            self.animation_count = 0
        self.animation_count += 1

        if self.reset_offset == 0:
            self.offset_x = random.randrange(-150, 150)
            self.offset_y = random.randrange(-150, 150)
            self.reset_offset = random.randrange(120, 150)
        else:
            self.reset_offset -= 1

        if player.x + self.offset_x > self.x-display_scroll[0]:
            self.x += 1
        elif player.x + self.offset_x < self.x-display_scroll[0]:
            self.x -= 1

        if player.y + self.offset_y > self.y-display_scroll[1]:
            self.y += 1
        elif player.y + self.offset_y < self.y-display_scroll[1]:
            self.y -= 1

        display.blit(pygame.transform.scale(self.animation_images[self.animation_count//4], (50, 50)), (self.x-display_scroll[0], self.y-display_scroll[1]))

        self.hit_box = (self.x-display_scroll[0]-10, self.y-display_scroll[1]-10, 70, 70)
        pygame.draw.rect(display, (255, 0, 0), self.hit_box, 2)

class Enemy2(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.hit_box = (self.x+5, self.y +10, 70, 70)
        self.animation_images = [pygame.image.load("Enemy1_animation_0 copy.png"), pygame.image.load("Enemy1_animation_1 copy.png"),
        pygame.image.load("Enemy1_animation_2 copy.png"), pygame.image.load("Enemy1_animation_3 copy.png")]
        self.animation_count = 0
        self.reset_offset = 0
        self.offset_x = random.randrange(-150, 150)
        self.offset_y = random.randrange(-150, 150)
        self.health = 10


    def main(self, display):
        if self.animation_count + 1 == 16:
            self.animation_count = 0
        self.animation_count += 1

        if self.reset_offset == 0:
            self.offset_x = random.randrange(-150, 150)
            self.offset_y = random.randrange(-150, 150)
            self.reset_offset = random.randrange(120, 150)
        else:
            self.reset_offset -= 1

        if player.x + self.offset_x > self.x-display_scroll[0]:
            self.x += 1
        elif player.x + self.offset_x < self.x-display_scroll[0]:
            self.x -= 1

        if player.y + self.offset_y > self.y-display_scroll[1]:
            self.y += 1
        elif player.y + self.offset_y < self.y-display_scroll[1]:
            self.y -= 1

        display.blit(pygame.transform.scale(self.animation_images[self.animation_count//4], (80, 80)), (self.x-display_scroll[0], self.y-display_scroll[1]))

        self.hit_box = (self.x-display_scroll[0]+5, self.y-display_scroll[1]+10, 70, 70)
        pygame.draw.rect(display, (0, 0, 0), self.hit_box, 2)

class Enemy3(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.hit_box = (self.x-10, self.y -10, 70, 70)
        self.animation_images = [pygame.image.load("Enemy3_animation_0.png"), pygame.image.load("Enemy3_animation_1.png"),
        pygame.image.load("Enemy3_animation_2.png"), pygame.image.load("Enemy3_animation_3.png")]
        self.animation_count = 0
        self.reset_offset = 0
        self.offset_x = random.randrange(-150, 150)
        self.offset_y = random.randrange(-150, 150)
        self.health = 4


    def main(self, display):
        if self.animation_count + 1 == 16:
            self.animation_count = 0
        self.animation_count += 1

        if self.reset_offset == 0:
            self.offset_x = random.randrange(-150, 150)
            self.offset_y = random.randrange(-150, 150)
            self.reset_offset = random.randrange(120, 150)
        else:
            self.reset_offset -= 1

        if player.x + self.offset_x > self.x-display_scroll[0]:
            self.x += 1
        elif player.x + self.offset_x < self.x-display_scroll[0]:
            self.x -= 1

        if player.y + self.offset_y > self.y-display_scroll[1]:
            self.y += 1
        elif player.y + self.offset_y < self.y-display_scroll[1]:
            self.y -= 1

        display.blit(pygame.transform.scale(self.animation_images[self.animation_count//4], (50, 50)), (self.x-display_scroll[0], self.y-display_scroll[1]))

        self.hit_box = (self.x-display_scroll[0]-10, self.y-display_scroll[1]-10, 70, 70)
        pygame.draw.rect(display, (255, 0, 0), self.hit_box, 2)

#lists and functions

enemies = [Enemy1(600, 400), Enemy2(800, -200), Enemy3(100, 500)]

sounds = ['explosion1.mp3', 'explosion2.mp3', 'explosion3.mp3']

player = Player(400, 300, 32, 32)

display_scroll = [0,0]


player_bullets = []

while True:
    display.fill((0, 0, 0))
    display.blit(displayImage, (0, 0))
    #display.blit(ImageBackground, (0, 0))
    display.blit(Earth, (700, 100))


    mouse_x, mouse_y = pygame.mouse.get_pos()

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
            pygame.quit()



        if event.type == pygame.MOUSEBUTTONDOWN:
            if event.button == 1:
                player_bullets.append(PlayerBullet(player.x, player.y, mouse_x, mouse_y))
                from playsound import playsound
                playsound('lazer.mp3', block=False)


    for enemy in enemies:
        for bullet in player_bullets:
            if pygame.Rect(enemy.hit_box).collidepoint(bullet.x, bullet.y):
                player_bullets.remove(bullet)
                enemy.health -= 1
                if enemy.health == 0:
                    enemies.remove(enemy)
                    

        enemy.main(display)
Asked By: Maddox Styles

||

Answers:

You have a main loop. Before your loop, do:

enemytime = time.time() + 5

Then, in the loop, do something like:

    if time.time() >= enemytime:
        # Time to spawn a new enemy.
        enemies.append( Enemy3( 100, 500 ) )
        # Reset the alarm.
        enemytime = time.time() + 5
Answered By: Tim Roberts
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.