added enemy spawn in groups

This commit is contained in:
Kristofers-Solo 2022-03-11 10:26:45 +02:00
parent 6af0b8e7d9
commit cdbd726c92

View File

@ -4,7 +4,7 @@
# TODO: Add enemy movement in groups # TODO: Add enemy movement in groups
import pygame import pygame
from random import randrange, choice from random import randint, randrange, choice
from os.path import abspath, dirname, join from os.path import abspath, dirname, join
WIDTH, HEIGHT = 800, 800 WIDTH, HEIGHT = 800, 800
@ -48,8 +48,8 @@ class Missile:
def draw(self, window) -> None: def draw(self, window) -> None:
window.blit(self.img, (self.x, self.y)) window.blit(self.img, (self.x, self.y))
def move(self, velocity: int) -> None: def move(self, vel: int) -> None:
self.y += velocity self.y += vel
def off_screen(self, height: int) -> bool: def off_screen(self, height: int) -> bool:
return not (self.y <= height and self.y >= 0) return not (self.y <= height and self.y >= 0)
@ -75,10 +75,10 @@ class Ship:
for missile in self.missiles: for missile in self.missiles:
missile.draw(WINDOW) missile.draw(WINDOW)
def move_missiles(self, velocity: int, obj) -> None: def move_missiles(self, vel: int, obj) -> None:
self.cooldown() self.cooldown()
for missile in self.missiles: for missile in self.missiles:
missile.move(velocity) missile.move(vel)
if missile.off_screen(HEIGHT): if missile.off_screen(HEIGHT):
self.missiles.remove(missile) self.missiles.remove(missile)
elif missile.collision(obj): elif missile.collision(obj):
@ -93,7 +93,7 @@ class Ship:
def shoot(self) -> None: def shoot(self) -> None:
if self.cooldown_counter == 0: if self.cooldown_counter == 0:
missile = Missile(self.x + self.get_width() / 2 - 5 / 2, self.y, self.missile_img) # missile spawn offset missile = Missile(self.x + self.get_width() / 2 - 5 / 2, self.y, self.missile_img) # missile spawn with offset
self.missiles.append(missile) self.missiles.append(missile)
self.cooldown_counter = 1 self.cooldown_counter = 1
@ -111,12 +111,12 @@ class Player(Ship):
self.missile_img = PLAYER_MISSILE self.missile_img = PLAYER_MISSILE
self.mask = pygame.mask.from_surface(self.ship_img) self.mask = pygame.mask.from_surface(self.ship_img)
self.max_lives = lives self.max_lives = lives
self.score = 100 self.score = 0
def move_missiles(self, velocity: int, objs: list) -> None: def move_missiles(self, vel: int, objs: list) -> None:
self.cooldown() self.cooldown()
for missile in self.missiles: for missile in self.missiles:
missile.move(velocity) missile.move(vel)
if missile.off_screen(HEIGHT): if missile.off_screen(HEIGHT):
self.missiles.remove(missile) self.missiles.remove(missile)
self.score -= 10 self.score -= 10
@ -142,8 +142,14 @@ class Enemy(Ship):
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)
def move(self, velocity: int) -> None: def move(self, vel_x: int, vel_y: int) -> None:
self.y += velocity self.x += vel_x
self.y += vel_y
class EnemiesGroup(Enemy):
def __init__(self, rows: int, columns: int) -> None:
super().__init__(rows, columns)
def main() -> None: def main() -> None:
@ -154,13 +160,17 @@ def main() -> None:
level = 0 level = 0
enemies = [] enemies = []
wave_length = 3 player_vel = 7
player_velocity = 7 player_missile_vel = 7
player_missile_velocity = 7 enemy_x_vel = 2
enemy_velocity = 2 vel_y = 0
enemy_missile_velocity = 4 vel_x = enemy_x_vel
enemy_missile_vel = 4
# velocities = [[5, 0], [0, 2], [-5, 0], [-5, 0], [0, 2], [5, 0]]
# velocities = {"down": [0, 2], "right": [2, 0], "left": [-5, 0]}
# directions = ["right", "down", "left", "left", "down", "right"]
player = Player(300, 650) player = Player(WIDTH / 2, 650)
clock = pygame.time.Clock() clock = pygame.time.Clock()
@ -189,7 +199,7 @@ def main() -> None:
clock.tick(FPS) clock.tick(FPS)
redraw_window() redraw_window()
if player.lives <= 0 or player.score <= 0: if player.lives <= 0:
lost = True lost = True
lost_count += 1 lost_count += 1
@ -202,11 +212,12 @@ def main() -> None:
if len(enemies) == 0: if len(enemies) == 0:
level += 1 level += 1
wave_length += 5 margin = 75
# spawn enemies width = 75
for _ in range(wave_length): for x in range(margin, WIDTH - margin, width):
enemy = Enemy(randrange(50, WIDTH - 100), randrange(-1500, -100), choice(["magenta", "cyan", "lime"])) for y in range(margin, int(HEIGHT / 2), width):
enemies.append(enemy) enemy = Enemy(x, y, choice(["magenta", "lime", "cyan"]))
enemies.append(enemy)
for event in pygame.event.get(): for event in pygame.event.get():
# quit game # quit game
@ -216,28 +227,50 @@ def main() -> None:
keys = pygame.key.get_pressed() keys = pygame.key.get_pressed()
# move left # move left
if (keys[pygame.K_a] or keys[pygame.K_LEFT]) and (player.x - player_velocity > 0): if (keys[pygame.K_a] or keys[pygame.K_LEFT]) and (player.x - player_vel > 0):
player.x -= player_velocity player.x -= player_vel
# move right # move right
if (keys[pygame.K_d] or keys[pygame.K_RIGHT]) and (player.x + player_velocity + player.get_width() < WIDTH): if (keys[pygame.K_d] or keys[pygame.K_RIGHT]) and (player.x + player_vel + player.get_width() < WIDTH):
player.x += player_velocity player.x += player_vel
# shoot # shoot
if keys[pygame.K_SPACE]: if keys[pygame.K_SPACE]:
player.shoot() player.shoot()
for enemy in enemies[:]: # enemies action
enemy.move(enemy_velocity)
enemy.move_missiles(enemy_missile_velocity, player)
if randrange(0, 2 * 60) == 1: # for _ in range(len(directions)):
enemy.shoot() # 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[:]:
# 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():
vel_x = -enemy_x_vel
elif enemy.x <= 0:
vel_x = enemy_x_vel
enemy.move(vel_x, vel_y)
enemy.move_missiles(enemy_missile_vel, player)
if randrange(0, 2 * 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)
player.move_missiles(-player_missile_velocity, enemies) player.move_missiles(-player_missile_vel, enemies)
# lambda functions # lambda functions