Cómo lidiar con diferentes resoluciones de dispositivos iOS en SpriteKit

Estoy jugando con SpriteKit en Xcode 6, iOS 8 beta 5. Todo está diseñado y funcionando perfectamente en el simulador de iPhone 4S; sin embargo, al cambiar a 5S, los elementos en la parte inferior de la pantalla se cortan.

A mi entender, la esquina inferior izquierda de la pantalla del iPhone debería ser CGPoint (0, 0), pero después de verificar la location, imprimiendo las coorderadas a la console, el punto más bajo de la esquina izquierda donde podía hacer clic era alnetworkingedor (5, 44). ¿Hay algún problema en la configuration de mi escena que esté causando esto?

No se han realizado cambios en el file GameViewController e incluso después de eliminar el file GameScene, el problema persiste.

Alguien puede al less señalarme en la dirección correcta con esto?

Agregar el siguiente código solucionará su problema (el código está en Swift):

scene.scaleMode = SKSceneScaleMode.ResizeFill 

Ahora, si quiere saber por qué esto soluciona su problema, cuál es su problema en realidad y cómo manejar varias resoluciones, le sugiero que continúe leyendo.

Hay tres cosas que pueden afectar la position de los nodos en tu escena.

1) punto de anclaje
Asegúrese de que el punto de anclaje de su escena esté configurado en la esquina inferior izquierda (0,0). Por defecto, el punto de anclaje de la escena comienza en (0,0), así que supongo que no está causando el problema.

2) Tamaño
Comtesting el tamaño de tu escena. Típicamente, el tamaño de mi escena coincide con el tamaño del dispositivo (es decir, iPad, iPhone 4 pulgadas, iPhone 3.5 pulgadas), luego coloco otra capa en la escena para almacenar mis nodos. Esto me permite hacer un efecto de desplazamiento para dispositivos con resoluciones más pequeñas, pero depende de tu juego de curso. Mi conjetura es que el tamaño de su escena podría establecerse en 320, 480, lo que podría causar problemas de posicionamiento en su iPhone 5s.

3) Modo de escala
El modo de escala tiene un gran efecto en el posicionamiento de los nodos en su escena. Asegúrate de configurar el modo de escala en algo que tenga sentido para tu juego. El modo de escala inicia cuando su tamaño de escena no coincide con el tamaño de la vista. Entonces, el propósito del modo de escala es dejar que Sprite Kit sepa cómo lidiar con esta situación. Mi conjetura es que tiene el tamaño de escena establecido en 320.480 y la escena se escala para que coincida con la vista del iPhone 5, lo que causará problemas de posicionamiento idénticos a los que describió. A continuación se muestran los diferentes modos de escala que puede configurar para su escena.

 SKSceneScaleMode.AspectFill 

El factor de escala de cada dimensión se calcula y se elige el mayor de los dos. Cada eje de la escena se escala con el mismo factor de escala. Esto garantiza que se llena todo el área de la vista, pero puede provocar que se recorten partes de la escena.

 SKSceneScaleMode.AspectFit 

El factor de escala de cada dimensión se calcula y se elige el más pequeño de los dos. Cada eje de la escena se escala con el mismo factor de escala. Esto garantiza que toda la escena esté visible, pero puede requerir buzones en la vista.

 SKSceneScaleMode.Fill 

Cada eje de la escena se escala de forma independiente para que cada eje de la escena se corresponda exactamente con la longitud de ese eje en la vista.

 SKSceneScaleMode.ResizeFill 

La escena no se escala para que coincida con la vista. En cambio, la escena cambia automáticamente de tamaño para que sus dimensiones siempre coincidan con las de la vista.

Conclusión
Parece que quieres eliminar la escala de tu escena, de esa manera tus posiciones en la escena coincidirán con las posiciones reales en la vista. Puede establecer el tamaño de la escena para que coincida con el tamaño de la vista, en cuyo caso no tendrá lugar ninguna escala. O puede configurar el modo de escala de su escena en ResizeFill, que siempre hará que el tamaño de la escena coincida con el tamaño de su vista y no escalará nada. En general, me mantendría alejado de cualquier escala y, en su lugar, ajustaría la interfaz y el tamaño de escena para adaptarse mejor a cada dispositivo. También puede agregar zoom y / o desplazamiento para permitir que los dispositivos con resoluciones más pequeñas scopen el mismo campo de vista.


¿Pero qué pasa si quiero escalar mi escena?
Sin embargo, si necesita escalar su escena, pero quiere que las posiciones sean relativas a la vista (es decir, desea que (0,0) esté en la parte inferior izquierda de la pantalla, incluso cuando la escena está interrumpida), entonces vea mi respuesta aquí


Información adicional
Vea la respuesta aquí para get un código de muestra que muestra cómo los nodos de disposition dinámicamente.

Consulte la respuesta aquí para get más detalles sobre la escala para admitir varios dispositivos.

Si desea conservar el tamaño de su escena (generalmente deseada cuando trabaja con un sistema de coorderadas y tamaño fijo), es posible que desee agregar relleno a cualquier lado de su escena. Esto eliminaría el boxeo de cartas y conservaría toda la física y la dinámica de su aplicación en cualquier plataforma.

Creé un pequeño marco para ayudar con esto:

https://github.com/Tokuriku/tokuriku-framework-stash

Sólo:

  1. Descargue el file ZIP para el repository
  2. Abra la subcarpeta "SceneSizer"
  3. Arrastra el "bloque lego" de SceneSizer.framework en tu proyecto
  4. Asegúrese de que el marco en Embedded y no solo en Linked
  5. Importe Framework en algún lugar de su código de import SceneSizer

Y ya está, ahora puede llamar a la class sizer con: SceneSizer.calculateSceneSize(#initialSize: CGSize, desinetworkingWidth: CGFloat, desinetworkingHeight: CGFloat) -> CGSize

Por si acaso, intente hacer CMD + 1, funcionó para mí. Algunos de los elementos fueron cortados porque simplemente no se mostraban en el Simulador, hago hincapié en esto, esta es solo una function de simulador (y un error si me lo pregunta, horas perdidas para resolver esto). CMD + 2, CMD + 3 vistas a veces pueden ocultar partes de la escena.