Tratando con diferentes resoluciones de dispositivos iOS en SpriteKit

Estoy jugando con SpriteKit en Xcode 6, iOS 8 beta 5. Todo está diseñado y funciona perfectamente en el simulador de iPhone 4S, sin embargo, al cambiar al 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 ubicación, imprimiendo las coordenadas de la consola que el punto más bajo de la esquina izquierda podía hacer clic estaba alrededor (5, 44). ¿Hay algo mal en la configuración de mi escena que esté causando esto?

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

¿Puede alguien al menos 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 realmente su problema y cómo manejar múltiples resoluciones, le sugiero que continúe leyendo.

Hay tres cosas que pueden afectar la posición de los nodos en su escena.

1) Punto de anclaje
Asegúrese de que el punto de anclaje de su escena esté configurado en (0,0) abajo a la izquierda. 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
Verifica el tamaño de tu escena. Normalmente hago que el tamaño de mi escena coincida con el tamaño del dispositivo (es decir, iPad, iPhone de 4 pulgadas, iPhone de 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. Supongo que el tamaño de su escena podría estar configurado en 320, 480, lo que podría estar causando 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 establecer el modo de escala en algo que tenga sentido para tu juego. El modo de escala se activa cuando el tamaño de la 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 manejar esta situación. Supongo 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 provocará problemas de posicionamiento idénticos a los que describió. A continuación se muestran los distintos modos de escala que puede configurar para su escena.

 SKSceneScaleMode.AspectFill 

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

 SKSceneScaleMode.AspectFit 

Se calcula el factor de escala de cada dimensión y se elige el menor de los dos. Cada eje de la escena se escala por el mismo factor de escala. Esto garantiza que toda la escena sea visible, pero puede requerir un letterbox en la vista.

 SKSceneScaleMode.Fill 

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

 SKSceneScaleMode.ResizeFill 

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

Conclusión
Parece que desea eliminar la escala de su escena, de ese modo sus posiciones en la escena coincidirán con las posiciones reales en la vista. Puede configurar el tamaño de su escena para que coincida con el tamaño de la vista, en cuyo caso no se aplicará 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é la interfaz y el tamaño de la escena para que se adapten mejor a cada dispositivo. Es posible que también desee agregar zoom y / o desplazamiento para permitir que los dispositivos con resoluciones más pequeñas logren el mismo campo de vista.


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


Información adicional
Consulte la respuesta aquí para obtener un código de muestra que muestra cómo diseño los nodos dinámicamente.

Consulte la respuesta aquí para obtener más detalles sobre la escala para admitir múltiples dispositivos.

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

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

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

Sólo:

  1. Descargue el archivo ZIP para el Repositorio
  2. Abra la subcarpeta “SceneSizer”
  3. Arrastre el “bloque de lego” de SceneSizer.framework en su proyecto
  4. Asegúrese de que el Framework esté integrado y no solo vinculado
  5. Importe el Marco en algún lugar de su código import SceneSizer

Y listo, ahora puede llamar a la clase SceneSizer.calculateSceneSize(#initialSize: CGSize, desiredWidth: CGFloat, desiredHeight: CGFloat) -> CGSize con: SceneSizer.calculateSceneSize(#initialSize: CGSize, desiredWidth: CGFloat, desiredHeight: 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. Insisto en esto, esta es solo una función de simulador (y un error si me preguntan, perdieron horas de tiempo para resolver esto). Las vistas CMD + 2, CMD + 3 a veces pueden ocultar partes de la escena.