Cocos2DX

Одно из основных отличий при проектировании для разных размеров в Cocos2DX заключается в том, что фреймворк предоставляет 3 папки по умолчанию для размещения ресурсов разных размеров. Эти 3 папки: HDD, HD и SD. По умолчанию движок создает файл AppDelegate.cpp, в котором он выбирает папку для использования в зависимости от высоты экрана.

Это работает для большинства случаев, и есть 2 статьи с изложением дизайнерских решений для этого здесь и здесь. Обе статьи немного устарели, но применяются одни и те же концепции. Два основных метода настройки ресурсов в соответствии с размером экрана: setContentScaleFactor() и setDesignResolutionSize(). Эти 2 метода будут внутренне масштабировать ваши активы, и вам не придется беспокоиться о дополнительном коде или логике для обработки разных разрешений экрана. Если по какой-либо причине это не работает для вашего конкретного случая использования, упомянутые выше методы можно изменить по своему вкусу.

Одна вещь, не упомянутая в документации Cocos2DX, касается интервалов и позиционирования элементов для разных размеров экрана. Чтобы решить эту проблему, я создал файл Definitions.h, содержащий значения для позиционирования элементов на постоянном пропорциональном расстоянии для каждого размера экрана.

Definitions.h выглядит так:

#ifndef __DEFINITIONS_H__
#define __DEFINITIONS_H__
namespace CONSTANTS
{
const float BLOCK_VERT_PADDING = 0.105;
const float BLOCK_FONT = 0.035;
}
#endif // __DEFINITIONS_H__

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

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

auto center = Vec2(origin.x + visibleSize.width * 0.5, origin.y + visibleSize.height * 0.5);
auto scoreText = Label::createWithTTF(“Score”, “fonts/Marker Felt.ttf”, 0.08 * (origin.y + visibleSize.height));
scoreText->setPosition(Vec2(center.x, center.y + (center.y * 0.9)));
this->addChild(scoreText, 1);

Обратите внимание, что 0,9 используется в качестве процентного множителя, используя центр экрана в качестве контрольной точки для получения его положения в вызове метода setPosition.

Единство

Для сравнения, Unity не создает 3 папки ресурсов. Вместо этого у него есть гораздо более простое решение этой проблемы, значение размера элемента камеры, прикрепленного к сцене, может быть изменено в зависимости от разрешения экрана.

Изменение значения размера на большее значение перемещает камеру от экрана, в результате чего все кажется меньше, а меньшее значение перемещает ее ближе к экрану, в результате чего все кажется больше. В одной из моих игр на Unity у меня есть очень простой скрипт для изменения значения размера на меньшее значение в зависимости от разрешения экрана.

public class CameraAdjust : MonoBehaviour {
   void Awake(){
     if(Camera.main.aspect > 0.7f) 
         Camera.main.orthographicSize = 4.65f;
   }
}

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

Позиционирование элементов GUI также немного проще. В общем, настройка параметров в элементе RectTransform — это почти единственное, что вам нужно сделать, и все готово.

Заключительные замечания

Это было краткое изложение сравнения того, как Cocos2DX и Unity подходят для разных размеров экрана. Cocos2DX довольно прост, если вы понимаете, как движок работает с активами. Unity очень прост, и почти все можно сделать в редакторе.

В будущем я буду проводить больше сравнений между Cocos2DX и Unity. Если есть что-то, что вы хотите увидеть, в частности, отправьте мне сообщение или напишите в комментариях ниже!