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()