Глава 21 · Проект: космический шутер

Перемещаем космический корабль

Управление с ограничением по краям экрана — и первые враги, появляющиеся сверху.

Перемещаем космический корабль

Управление — через get_pressed() из главы 20 (непрерывное движение, пока клавиша зажата), с ограничением, чтобы корабль не улетел за края экрана:

dvizhenie_korablya.py
KORABL_SKOROST = 6

def obrabotat_klavishi(korabl, klavishi):
    if klavishi[pygame.K_LEFT]:
        korabl.x -= KORABL_SKOROST
    if klavishi[pygame.K_RIGHT]:
        korabl.x += KORABL_SKOROST
    korabl.x = max(0, min(korabl.x, SHIRINA - KORABL_SHIRINA))
max/min — тот же приём ограничения, что и в главе 20
max(0, min(korabl.x, SHIRINA - KORABL_SHIRINA)) гарантирует, что korabl.x никогда не выйдет за пределы [0, SHIRINA - KORABL_SHIRINA] — тот же самый приём «зажимания» значения в диапазон, что мы использовали для прыгающего мяча.

Создаём и перемещаем врагов

Врагов будет много, и они появляются со временем — значит, нужен список (глава 11) и счётчик кадров до следующего появления:

vragi.py
VRAG_SHIRINA, VRAG_VYSOTA = 40, 30
VRAG_SKOROST = 2
INTERVAL_POYAVLENIYA_VRAGA = 45   # кадров между новыми врагами

vragi = []
kadrov_do_vraga = INTERVAL_POYAVLENIYA_VRAGA

def sozdat_vraga():
    x = random.randint(0, SHIRINA - VRAG_SHIRINA)
    return pygame.Rect(x, -VRAG_VYSOTA, VRAG_SHIRINA, VRAG_VYSOTA)

# в игровом цикле, каждый кадр:
kadrov_do_vraga -= 1
if kadrov_do_vraga <= 0:
    vragi.append(sozdat_vraga())
    kadrov_do_vraga = INTERVAL_POYAVLENIYA_VRAGA

for vrag in vragi:
    vrag.y += VRAG_SKOROST
y = -VRAG_VYSOTA — враг появляется чуть выше экрана
Отрицательная стартовая координата Y означает, что враг рождается чуть выше видимой области и плавно «въезжает» в кадр сверху — а не появляется резко посередине экрана.
Практика в Jupyter Notebook
21-03-dvizhenie-vragi.ipynb · движение корабля и появление врагов
Открыть ноутбук →