Пулю добавлял ты — нажатием пробела. Врагов добавляет сама игра
каждые несколько кадров. Для этого заводим счётчик кадров
spawn_timer: он растёт каждый кадр, и когда дорастёт до
SPAWN_EVERY — добавляем врага и обнуляем счётчик.
import pygame, sys, random # random — для случайного места ENEMY_SIZE = 32 ENEMY_SPEED = 2 SPAWN_EVERY = 45 # через сколько кадров новый враг enemies = [] # СПИСОК врагов spawn_timer = 0 def draw_enemy(e): """Пришелец — красный кружок с глазками.""" ex, ey = e.center pygame.draw.circle(screen, ENEMY_COLOR, (ex, ey), ENEMY_SIZE // 2) pygame.draw.circle(screen, WHITE, (ex - 6, ey - 3), 4) pygame.draw.circle(screen, WHITE, (ex + 6, ey - 3), 4) pygame.draw.circle(screen, BG, (ex - 6, ey - 3), 2) pygame.draw.circle(screen, BG, (ex + 6, ey - 3), 2) # --- в игровом цикле --- # каждые SPAWN_EVERY кадров ДОБАВЛЯЕМ нового врага сверху spawn_timer += 1 if spawn_timer >= SPAWN_EVERY: spawn_timer = 0 x = random.randint(0, WIDTH - ENEMY_SIZE) enemies.append(pygame.Rect(x, -ENEMY_SIZE, ENEMY_SIZE, ENEMY_SIZE)) # враги летят вниз; улетевших за низ УБИРАЕМ for e in enemies[:]: e.y += ENEMY_SPEED if e.top > HEIGHT: enemies.remove(e) # рисуем каждого врага из списка for e in enemies: draw_enemy(e)
y = -ENEMY_SIZE?Чтобы он «выезжал» из-за верхнего края плавно, а не появлялся резко. Минус высота — значит он сначала весь над экраном, потом постепенно вползает.
Сравни с пулями — код почти одинаковый! Это и есть сила приёма «список объектов»: один и тот же шаблон работает и для пуль, и для врагов, и для чего угодно ещё.
draw_enemy(e)Рисовать пришельца — несколько строк (кружок + глазки). Чтобы не повторять их,
завернули в функцию, как make_bricks() в Арканоиде. Вызвал
draw_enemy(e) — нарисовался один враг.
SPAWN_EVERY = 25.ENEMY_SPEED = 4.ENEMY_SIZE — глазки сдвинутся сами.