[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjog" } } }, { "id": 10, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "create", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-250597-0", "render_to": "inpage_VI-250597-0-549065259", "adfox_url": "//ads.adfox.ru/228129/getCode?p1=bxeub&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid21=&puid22=&puid31=&puid32=&fmt=1&pr=" } } ]
{ "author_name": "Андрей Верещагин", "author_type": "self", "tags": ["\u0430\u0440\u0442"], "comments": 7, "likes": 24, "favorites": 18, "is_advertisement": false, "section_name": "gamedev", "id": "11216" }
Андрей Верещагин
1 489
Gamedev

Масштабирование ассетов в 2D-игре

Как заставить изображение выглядеть хорошо на всех экранах.

Поделиться

В избранное

В избранном

Основатель студии 6x13 Games Кенан Болукбаси (Kenan Bolukbasi) в блоге на сайте Gamasutra рассказал о масштабировании двухмерных ассетов под разные размеры экранов и разрешения.

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

Учитывайте, что большинство методов масштабирования плохо реагируют на изменение соотношений сторон экрана. Они могут хорошо работать на вашем тестовом мониторе, но потом всё развалится. Я расскажу об одном методе масштабирования ассетов, который хорошо подошёл для всех четырёх игр, которые мы выпустили.

Есть три вещи, которые вы ожидаете от своего движка:

  • ​выбор наиболее подходящей графики в зависимости от разрешения дисплея;
  • масштабирование выбранных элементов для того, чтобы они подходили под размер экрана;
  • движок позволяет вам игнорировать все проблемы с дисплеем и сосредоточиться на написании кода для самой игры.

Предположим, мы используем движок Cocos2d-x и будем использовать терминологию, принятую среди разработчиков на нём. Cocos предоставляет базовый набор инструментов, поэтому методы, описанные ниже, подойдут и для других 2D-движков.

Политика разрешения

На самом деле к разрешению она не имеет никакого отношения. Здесь дело в кадрировании.

Cocos2d-x автоматически масштабирует всю сцену под размер кадра. Именно политика разрешения (Resolution policy) позволяет вам определять, как именно сцена занимает кадр.

Вам нужна безопасная зона. Она не только показывает, какую часть экрана увидит игрок, но и занимает как можно больше пространства. Всё, что за пределами жёлтой области — всего лишь декорации, которые заменяют собой чёрные границы. За пределы этой области не стоит помещать ничего, что может быть важным для игрока.

Безопасная зона в нашем примере занимает 480х320 единиц (units), на экране в 570х360 единиц. Не пикселей, единиц. Соотношение сторон тут — 1,5f. Но как мы можем быть в этом уверены?

Мы вычисляем опорную ось (reference axis), исходя из соотношения сторон дисплея. Затем мы выбираем фиксированную высоту или фиксированную ширину, исходя из опорной ости. Если опорная Y, то фиксированной становится высота, в противном случае — ширина.

Размер композиции

Для того, чтобы Cocos смог «подогнать» сцену под размер кадра, движок должен «понимать», что именно мы считаем «сценой». Это и есть размер композиции (Design Size). В нашем случае размер композиции — это величина безопасной зоны.

Как только мы зададим размер композиции и политику разрешения, движок начнёт вести себя «как взрослый». Вот так он реагирует на изменения соотношения сторон и физического размера экрана.

Итак:

  • Cocos масштабирует под размеры экрана;
  • политика разрешения указывает, «как» подстраивать под размеры экрана;
  • размер композиции указывает, «что» подстраивать.

Поддержка нескольких разрешений

Нам надо сделать так, чтобы ассеты быстро обрабатывались, правильно использовали видео-память и могли нормально отображаться при минимальном количестве проходов алиасинга в ходе масштабирования. Для этого мы добавили ассеты разного разрешения, поместив каждый набор в отдельную директорию.

Наиболее подходящий размер мы выбираем в зависимости от размера экрана, заданного опорной осью. В пикселях. После этого достаточно добавить нужную директорию в «Resource Search Path» в движке, опуская остальные, чтобы они даже не были видны.

Фактор масштабирования контента

Мы также добавляем фактор масштабирования к каждой директории для того, чтобы движок знал, как ассеты соотносятся с размером композиции. Это просто. Например, если «средний» ассет в два раза больше значения размера композиции, то значение масштаба — 2.

На этом этапе мы можем забыть о выборе ассетов, разрешении, вариантах PPI, retina-дисплеях, необычных соотношениях сторон и прочем. Мы просто «представляем», что размер экрана — 480х320, когда пишем код. За исключением тех случаев, когда вы хотите добавить декоративные элементы за пределами безопасной зоны.

#арт

Популярные материалы
Показать еще
{ "is_needs_advanced_access": false }

Комментарии Комм.

0 новых

Популярные

По порядку

Прямой эфир

Узнавайте первым важные новости

Подписаться