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

Игровое поле и интерфейс игрока

Счёт и жизни живут в своей полосе сверху — игровые объекты в неё физически не заходят.

Глава 19 уже показывала, что бывает, если интерфейс перекрывает игровое поле: важный текст может оказаться под движущимся объектом. Финальная версия шутера с самого начала разделяет экран на две чётко разные области: игровое поле и полосу с показаниями для игрока — счётом, жизнями, номером волны. Такую полосу поверх игрового мира в индустрии принято называть HUD (Heads-Up Display, «приборная панель» — интерфейс, который не является частью самой игры, а просто показывает её текущее состояние).

Реальное окно: верхняя тёмная полоса HUD со счётом и жизнями отделена тонкой линией от основного игрового поля со звёздным фоном и кораблём внизу
Реальное окно — полоса интерфейса сверху (64 пикселя) отделена тонкой линией от игрового поля; ни один враг или снаряд не может оказаться выше этой границы.
fragment_playfield.py
HUD_HEIGHT = 64

self.playfield = pygame.Rect(0, HUD_HEIGHT, SHIRINA, VYSOTA - HUD_HEIGHT)

Игровое поле — обычный Rect, а не просто число отступа: у него сразу есть .top, .bottom, .left, .right — то же самое, что возвращает korabl.top в разделе 21.2, только теперь описывает не один объект, а всю разрешённую область движения.

Что где происходитОбласть
Счёт, жизни, волнаHUD-полоса (0 — HUD_HEIGHT)
Корабль, враги, пули, взрывыИгровое поле (HUD_HEIGHT — низ экрана)
Появление враговЧуть выше верхней границы игрового поля
Побег врага (раздел 21.16)Пересечение нижней границы игрового поля
Корабль ограничен именно игровым полем, а не всем окном
Player.move() (раздел 21.11) зажимает позицию в границах self.playfield, а не всего окна SHIRINA × VYSOTA — иначе корабль мог бы заехать под HUD и спрятать сам себя за текстом счёта.