Глава 20 · Разработка игр с Pygame

Экран мобильной игры: ориентация, пропорции и High-DPI

Мобильный экран не похож на десктопное окно: он поворачивается, у него нет стандартного соотношения сторон и часто высокая плотность пикселей.

На десктопе игра почти всегда получает окно фиксированного или свободно меняемого размера, которое выбирает сам игрок. Мобильный экран устроен иначе — и у него есть сразу несколько собственных источников сложности: ориентация, соотношение сторон, безопасная область и высокая плотность пикселей.

Ориентация экрана

Телефон можно держать вертикально (portrait) или горизонтально (landscape), и игрок вправе повернуть устройство в любой момент. Игра должна либо явно ограничить себя одной ориентацией (частый выбор для аркад и головоломок), либо честно пересчитывать раскладку экрана при повороте — то есть повторно решать, куда поместить игровое поле и виртуальные кнопки управления из раздела 20.11.

Соотношение сторон и безопасная область

Экраны разных телефонов сильно отличаются по соотношению сторон — в отличие от десктопных мониторов, где почти всегда широкоформатный прямоугольник, здесь диапазон гораздо шире, от почти квадратных до сильно вытянутых. Дополнительно у многих современных экранов есть вырезы под камеру и закруглённые углы — область экрана, физически видимую пользователю, но небезопасную для важных элементов интерфейса. Разработчики называют пригодную для контента часть экрана safe area (безопасная область) — счёт и важные кнопки размещают внутри неё, а не впритык к самому краю экрана.

Реальное окно: тёмно-красная рамка по краю экрана и зелёная безопасная зона с подписью safe area внутри неё, с отступом от края
Реальное окно: безопасная область — прямоугольник с отступом от каждого края, куда и помещают счёт и важные кнопки.
Тот же принцип — на самом сайте книги
Идея safe area знакома вам не только из мобильной разработки: сайт этой книги тоже проектируется с оглядкой на маленькие экраны — контент не прижимается к самому краю на маленьких телефонах, а оставляет отступ по краям именно по этой причине.

Разрешение и плотность пикселей — разные вещи

Разрешение — это просто количество пикселей экрана, например 2400×1080. Плотность пикселей (PPI/DPI, pixels per inch) — это то, насколько плотно эти пиксели упакованы на реальном физическом размере экрана. У современных телефонов физический экран небольшой, а пикселей на нём часто больше, чем на заметно более крупном настольном мониторе — то есть плотность выше при сопоставимом или даже меньшем разрешении. Экран с высокой плотностью принято называть high-DPI.

Отсюда третье понятие — логический размер: то, в каких единицах ваш код и интерфейс думают об экране, в отличие от того, сколько на нём физических пикселей на самом деле:

Логическое разрешение игры
в этих единицах вы задаёте позиции и размеры в коде
Масштабирование
система или движок пересчитывают логические координаты в физические
Физические пиксели экрана
то, что реально светится на high-DPI дисплее
Изображение, нарисованное «один логический пиксель — один физический», на high-DPI экране выглядит мелким; поэтому растровые изображения часто готовят в нескольких разрешениях, а интерфейсные элементы, где это возможно, рисуют векторно.
Особенность экранаДесктопМобильные
ОриентацияОбычно фиксированная, не меняется во время игрыМожет поменяться в любой момент
Соотношение сторонСтандартный узкий диапазонШирокий разброс между устройствами
Вырезы и закруглённые углыПрактически не встречаютсяОбычное дело — нужна safe area
Плотность пикселейОбычно нижеЧасто заметно выше — нужен масштаб под high-DPI