Recursos de jogo 2D universais e posicionamento de nó absoluto
Eu tenho uma pergunta sobreativos de jogos universais eposicionamento absoluto de umSKNodes
noSprite Kit
(iOS 8 ou superior).
Vou tentar apresentar meu problema através de um exemplo da seguinte maneira:
Imagine umJogo 2D de cima para baixo com umSKSpriteNode
o que representa uma casa. Uma casa tem vários filhosSKSpriteNode
s que representam cadeiras, mesa, sofá, etc.
Eu tenho 3 versões do ativo da casa:
1x - 200 x 200px
(IPads sem retina),2x - 400 x 400px
(IPhones e iPads da Retina),3x - 600 x 600px
(iPhone 6 Plus).Importante: As posições dos nós filhos (cadeiras, mesa, etc.) são definidas emarquivo .plist. Algo assim (representação JSON):
children: [
{
position = {20,20};
},
...
]
Como a posição é definida em pontos e não em pixels, tudo é posicionado como esperado, de acordo com a escala da tela do dispositivo. Para1x
dispositivos a posição permanece{20,20}
, para2x
posição é{40,40}
e para3x
a posição é{60,60}
.
Problema:
O problema é que200x200px
e400x400px
ativos sãomaneira pequena para dispositivos iPad para obter uma aparência semelhante em todos os dispositivos.
Pergunta, questão:
Como apresentar / importar com êxito recursos de uma maneira que me permitisse obter uma aparência semelhante (se não a mesma) em todos os tamanhos de dispositivos / tela sem interromper o posicionamento dos nós filhos?
Minhas tomadas:
Take 1:
Eu poderia simplesmente usar o existente400x400px
ativos em dispositivos iPad sem retina e600x600px
ativos nos dispositivos iPad da Retina para o nó interno, mas o posicionamento dos nós filhos seria quebrado. Isso ocorre porque o valor da posição filho não mudaria e ainda seria{20,20}
e{40,40}
para dispositivos iPad, respectivamente, enquanto os ativos seriam maiores. Isso produziria posições filho imprecisas em relação ao nó da casa.
Take 2:
Eu também poderia escalar oSKScene
tamanho (efeito de zoom) enquanto usa o200x200px
e400x400px
ativos dimensionados para dispositivos iPad, respectivamente. Isso funciona e mantém o posicionamento dos nós filhos funcionando, mas a qualidade renderizada da cena / ativos não é boa como deveria ser. Além disso, isso parece um hack e não queremos isso.
Take 3:
Eu também poderia usar o dobro de grandes recursos para dispositivos iPad e dobrar a posição dos nós filhos no tempo de execução. Nesse caso, eu usaria um400x400px
ativo para dispositivos iPad sem retina e um novo800x800px
ativo para dispositivos iPad retina. Embora isso pareça ótimo e mantenha o posicionamento dos nós filhos funcionando, parece um hack muito grande que fixa a posição do nó filho durante o tempo de execução com isso:
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
position.x *= 2.0f;
position.y *= 2.0f;
}
Obrigado por reservar um tempo para ler a pergunta!