added enemy spawn in groups

This commit is contained in:
Kristofers-Solo 2022-03-11 16:13:28 +02:00
parent 62fdd541e2
commit 164aaaae93
2 changed files with 25 additions and 157 deletions

View File

@ -124,7 +124,14 @@ class Player(Ship):
for obj in objs: for obj in objs:
if missile.collision(obj): if missile.collision(obj):
objs.remove(obj) objs.remove(obj)
self.score += 50
# different scores for different colored enemies
if obj.color == "lime":
self.score += 10
elif obj.color == "cyan":
self.score += 20
elif obj.color == "magenta":
self.score += 30
if missile in self.missiles: if missile in self.missiles:
self.missiles.remove(missile) self.missiles.remove(missile)
@ -141,6 +148,7 @@ class Enemy(Ship):
self.ship_img = self.COLOR_MAP[color] self.ship_img = self.COLOR_MAP[color]
self.missile_img = ENEMY_MISSILE self.missile_img = ENEMY_MISSILE
self.mask = pygame.mask.from_surface(self.ship_img) self.mask = pygame.mask.from_surface(self.ship_img)
self.color = color
def move(self, vel_x: int, vel_y: int) -> None: def move(self, vel_x: int, vel_y: int) -> None:
self.x += vel_x self.x += vel_x
@ -158,12 +166,10 @@ def main() -> None:
player_vel = 7 player_vel = 7
player_missile_vel = 7 player_missile_vel = 7
enemy_x_vel = 2 enemy_x_vel = 2
vel_y = 0
vel_x = enemy_x_vel vel_x = enemy_x_vel
vel_y = 0
enemy_missile_vel = 4 enemy_missile_vel = 4
# velocities = [[5, 0], [0, 2], [-5, 0], [-5, 0], [0, 2], [5, 0]] last_enemy_shot = 0
# velocities = {"down": [0, 2], "right": [2, 0], "left": [-5, 0]}
# directions = ["right", "down", "left", "left", "down", "right"]
player = Player(WIDTH / 2, 650) player = Player(WIDTH / 2, 650)
@ -200,26 +206,23 @@ def main() -> None:
# stop game # stop game
if lost: if lost:
if lost_count > FPS * 3: if lost_count > FPS * 3: # wait for 3 sec
run = False run = False
else: else:
continue continue
# spawn enemies
if len(enemies) == 0: if len(enemies) == 0:
level += 1 level += 1
margin = 75 margin = 75
width = 75 for x in range(margin, WIDTH - margin, margin):
for x in range(margin, WIDTH - margin, width): for y in range(margin, int(HEIGHT / 2), margin):
for y in range(margin, int(HEIGHT / 2), width): if y == margin:
match y:
case 75:
color = "magenta" color = "magenta"
case 150: elif y == 2 * margin:
color = "cyan" color = "cyan"
case 300: elif y == 4 * margin:
color = "lime" color = "lime"
enemy = Enemy(x, y, color) enemy = Enemy(x, y, color)
enemies.append(enemy) enemies.append(enemy)
@ -242,37 +245,23 @@ def main() -> None:
# enemies action # enemies action
# for _ in range(len(directions)):
# if pygame.time.get_ticks() % 100 == 0:
# for direction in directions:
# vel_x, vel_y = velocities[direction]
# for enemy in enemies[:]:
# enemy.move(vel_x, vel_y)
# if pygame.time.get_ticks() % 10 == 0:
# for vel_x, vel_y in velocities:
# for enemy in enemies[:]:
# enemy.move(vel_x, vel_y)
for enemy in enemies[:]: for enemy in enemies[:]:
# enemy.move(0, enemy_y_vel)
# enemy.move(randint(-enemy_x_vel, enemy_x_vel), randint(0, enemy_y_vel))
if enemy.x >= WIDTH - enemy.get_width(): if enemy.x >= WIDTH - enemy.get_width():
vel_x = -enemy_x_vel vel_x = -enemy_x_vel
elif enemy.x <= 0: elif enemy.x <= 0:
vel_x = enemy_x_vel vel_x = enemy_x_vel
enemy.move(vel_x, vel_y) enemy.move(vel_x, vel_y)
enemy.move_missiles(enemy_missile_vel, player) enemy.move_missiles(enemy_missile_vel, player)
if randrange(0, 7 * FPS) == 1:
enemy.shoot()
pass
if collide(enemy, player) or (enemy.y + enemy.get_height() > HEIGHT): if collide(enemy, player) or (enemy.y + enemy.get_height() > HEIGHT):
player.score -= 10 player.score -= 10
player.lives -= 1 player.lives -= 1
enemies.remove(enemy) enemies.remove(enemy)
if pygame.time.get_ticks() - last_enemy_shot > 2000:
choice(enemies).shoot()
last_enemy_shot = pygame.time.get_ticks()
player.move_missiles(-player_missile_vel, enemies) player.move_missiles(-player_missile_vel, enemies)

View File

@ -1,121 +0,0 @@
# Author - Kristiāns Francis Cagulis
# Date - 25.02.2022
# Title - Space invaders
import pygame
import math
import random
BLUE = (16, 16, 69)
# init game
pygame.init()
pygame.display.set_caption("Space invaders")
# 32x32 game icon
icon = pygame.image.load("icons/space_invader_enemy_icon.png")
pygame.display.set_icon(icon)
# 64x64 player icon
player = pygame.image.load("icons/space_shuttle_player_icon.png")
player_x = 370
player_y = 480
player_x_change = 0
# 64x64 enemy icon
enemy = pygame.image.load("icons/space_invader_enemy_icon.png")
enemy_x = random.randint(0, 736)
enemy_y = random.randint(50, 150)
enemy_x_change = .2
enemy_y_change = 10
# missile
missile = pygame.image.load("icons/fireball_icon.png")
missile_x = 0
missile_y = 480 # player_y
missile_x_change = 0
missile_y_change = .50
missile_state = "ready"
screen = pygame.display.set_mode((800, 600))
def display_player(x, y):
screen.blit(player, (x, y))
def display_enemy(x, y):
screen.blit(enemy, (x, y))
def display_missile(x, y):
global missile_state
missile_state = "fire"
screen.blit(missile, (x + 16, y - 10))
def is_collision(enemy_x, enemy_y, missile_x, missile_y):
distance = math.sqrt(math.pow(enemy_x - missile_x, 2) + math.pow(enemy_y - missile_y, 2))
if distance < 27:
return True
else:
return False
running = True
while running:
screen.fill(BLUE)
# change player pos
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
player_x_change = -.5
if event.key == pygame.K_RIGHT:
player_x_change = .5
if event.key == pygame.K_SPACE:
if missile_state == "ready":
missile_x = player_x
# missile_state = "fire"
display_missile(missile_x, missile_y)
if event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
player_x_change = 0
# player pos
if player_x + player_x_change > 0 and player_x + player_x_change < 736:
player_x += player_x_change
enemy_x += enemy_x_change
enemy_y += enemy_y_change
# enemy pos
if enemy_x >= 736:
enemy_x_change = -.2
elif enemy_x <= 0:
enemy_x_change = .2
if enemy_y >= 336:
enemy_y_change = -.1
elif enemy_y <= 50:
enemy_y_change = .1
collision = is_collision(enemy_x, enemy_y, missile_x, missile_y)
if collision:
missile_y = 480
missile_state = "ready"
# score ...
display_enemy(enemy_x, enemy_y)
if missile_y <= 0:
missile_state = "ready"
if missile_state == "fire":
display_missile(missile_x, missile_y)
missile_y -= missile_y_change
display_player(player_x, player_y)
pygame.display.update()