У меня есть вопрос относительно универсальных игровых активов и абсолютного позиционирования 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;
}
Спасибо, что нашли время, чтобы прочитать вопрос!