В одній з перших статей я рекомендував видалити з створеного cocos дефолтного коду майже все, що стосується роботи з різними роздільними здатностями. Цій проблемі присвячений окремий баг в офіційному репозиторії, але у нього низький приорітет.
Розробка Cocos2d починалась у далекі-далекі часи, коли різновидів форматів екрану було небагато. Потім розмаїття сильно збільшилось, а на сьогоднішній день виглядає так, що всі користувачі знову ходять з більш-менш однаковими екранами. У певний момент була актуальною проблема роздільної здатності: програма мала використовувати різні набори зображень для пристроїв різних поколінь. На мій погляд, зараз такої необхідності уже немає, проте у вас може бути інша думка з цього приводу.
Теоретично, процес розробки має виглядати приблизно так:
У першій програмі ви могли бачити такий код:
auto visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
visibleSize — це розмір тієї частини екрану, яку бачить користувач. origin — положення нижнього лівого кута частини екрану, яку бачить користувач відносто того зображення, яке згенерувала б програма в ідеальному випадку.
Уявіть собі ось таку ситуацію (цифри на сьогоднішній день виглядають нереальними, але най буде)
В даному випадку:
visibleSize буде 1024x768, а origin стане (128:0) — позиція нижнього лівого кута червоного прямокутника на прикаді.Cocos2d пропонує кілька варіантів приведення (ResolutionPolicy):
EXACT_FIT — зображення повністю заповнює екран, пропорції ігноруются. Результат може бути розтягнено по горизонталі або вертикалі.FIXED_HEIGHT та FIXED_WIDTH — співвідношення сторін зберігається, зображення може обрізатись так, щоб зберегти відповідно висоту або ширину.NO_BORDER — схоже на автоматичне обирання FIXED_HEIGHT або FIXED_WIDTHSHOW_ALL — пропорції зберігаються, зображення повністю показується, але можуть бути чорні полоси по боках або зверху екрану.Також можна реалізувати свою власну політику, як зроблено у цій статті.
Крім того, можна не вказувати design resolution а запуститись з реальним розміром екрану. Для цього в AppDelegate.cpp треба зробити так:
Size realScreenSize = glview->getFrameSize();
glview->setDesignResolutionSize(realScreenSize.width, realScreenSize.height,
ResolutionPolicy::NO_BORDER);
Тут байдуже, яку ResolutionPolicy вказувати, все одно запуск виконується з розміром екрану поточного пристрою.
Якщо ви захочете використовувати різні набори зображень для різних пристроїв, доведеться змінювати дефолтні шляхи, за якими завантажуються файли. Детальніше про це написано тут, тут або у цій статті.