У меня есть вопрос относительно универсальных игровых активов и абсолютного позиционирования SKNodes в Sprite Kit (iOS 8 +).
Я попытаюсь представить свою проблему в следующем примере:
Представьте себе 2D сверху вниз игру с SKSpriteNode, которая представляет собой дом. В доме много детей SKSpriteNode, которые представляют собой стулья, письменный стол, диван и т.д.
У меня есть 3 версии домашнего имущества:
-
1x - 200 x 200px(не-сетчатые iPads), -
2x - 400 x 400px(Retina iPhones и iPads), -
3x - 600 x 600px(iPhone 6 Plus).
Внимание!: Позиции дочерних узлов (стулья, стол и т.д.) Определяются в файле .plist. Что-то вроде этого (представление JSON):
children: [
{
position = {20,20};
},
...
]
Поскольку позиция определяется в точках, а не в пикселях, все становится позиционированным, как ожидалось, в соответствии с масштабом экрана устройства. Для устройств 1x положение остается {20,20}, для 2x - {40,40}, а для 3x позиция {60,60}.
Проблема
Проблема заключается в том, что 200x200px и 400x400px активы относятся к малым для iPad устройств, чтобы добиться одинакового внешнего вида на всех устройствах.
Вопрос
Как успешно представлять/импортировать активы таким образом, чтобы мне добиться одинакового (если не то же) внешнего вида устройств/размеров экрана без нарушения расположения дочерних узлов?
Мое занятие:
Возьмите 1:
Я мог бы просто использовать существующие ресурсы 400x400px для устройств iPad без сетчатки и 600x600px активов на устройствах Retina iPad для дома node, но расположение дочерних узлов будет нарушено. Это связано с тем, что значение позиции дочернего элемента не изменилось и все равно будет {20,20} и {40,40} для устройств iPad соответственно, тогда как активы будут больше. Это приведет к неточным положениям ребенка по отношению к дому node.
Возьмите 2:
Я мог бы также масштабировать размер SKScene (эффект масштабирования) при использовании обычных ресурсов 200x200px и 400x400px для устройств iPad соответственно. Это работает, и он удерживает работу дочерних узлов, но качество воспроизведения сцены/активов не так хорошо, как должно быть. Кроме того, это похоже на взлом, и мы этого не хотим.
Возьмите 3:
Я мог бы также использовать в два раза большие активы для устройств iPad и удвоить положение дочерних узлов во время выполнения. В этом случае я бы использовал ресурс 400x400px для устройств iPad без сетчатки и новый ресурс 800x800px для устройств iPad Retina. Хотя это выглядит великолепно и поддерживает работу с дочерними узлами, это выглядит как по-настоящему большая позиция для хранения дочерних элементов node во время выполнения:
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
position.x *= 2.0f;
position.y *= 2.0f;
}
Спасибо, что нашли время, чтобы прочитать вопрос!