ios swift sprite-kit universal

Aplicación de dispositivo universal iOS con SpriteKit, ¿cómo escalar nodos para todas las vistas?



swift sprite-kit (1)

Quiero hacer que una aplicación horizontal sea universal , de modo que los nodos de sprite se escalen proporcionalmente al tamaño de vista que esté ejecutando la aplicación. Me gustaría una solución completamente programática porque no me gusta el IB.

Mi juego es bastante simple y no necesito desplazamiento ni zoom de ningún tipo, por lo que todo el juego siempre estará presente y ocupará toda la vista.

¿Es posible que lo que estoy buscando sea cambiar el tamaño de la escena para que siempre se ajuste a la vista? Si es así, ¿puede explicar esto a fondo porque he intentado cambiar esta sección de mi controlador de vista?

if let scene = GameScene(fileNamed:"GameScene")

para ser el método constructor que toma el tamaño como parámetro pero a Xcode no le gusta eso.

Cosas que he probado

  1. Usando fracciones de self.view.bounds.width / height. Esto generalmente hace que todos los iPhones se vean bien, pero en los iPads se extiende y sesga los nodos y el cuadro de límite alrededor de la vista.
  2. Cambiar el modo de escala entre los cuatro tipos. Me gustaría mantener buenas prácticas y sentir que .AspectFill (predeterminado) es con el que debería hacer que mi aplicación funcione, pero abierta a sugerencias. Nota; No quiero bordes negros en ningún dispositivo, solo la vista completa se muestra / escala proporcionalmente.
  3. Aplicación de restricciones programáticas. Ahora soy bastante nuevo en esto y no entiendo las restricciones por completo, pero ningún tutorial que haya visto incluso de RayWenderlich habla sobre restricciones en los nodos, así que no profundicé en esto.
  4. Usando un método como este para convertir puntos entre vistas. En realidad, esto funcionó bastante bien para el posicionamiento de puntos de los nodos, y si es posible me gustaría que este método funcione, pero aún tengo el problema de los tamaños de los nodos. Además, cuando construyo para iPad con este método, la vista parece comenzar como retrato y los nodos se ven bien, pero luego tengo que cambiarlo manualmente a paisaje y los sprites y los límites de la vista una vez más se confunden. Aquí está el método:

    func convert(point: CGPoint)->CGPoint { return self.view!.convertPoint(CGPoint(x: point.x, y:self.view!.frame.height-point.y), toScene:self) }

  5. Innumerables tutoriales de vid en RW y en cualquier otro lugar de Internet.

¡Gracias por adelantado! Agradezco la ayuda. Sé que este tema es extraño porque mucha gente hace preguntas al respecto, pero la situación de todos parece ser lo suficientemente diferente como para que una solución no sea adecuada para todos.


Inicialmente intenté escalar yo mismo con 2 juegos y fue una locura (tamaño de escena = tamaño de vista o modo de escala de escena = .ResizeFill). Debe ajustar todos los valores, por ejemplo, tamaño de fuente, tamaño de sprite, impulsos, etc. para todos los dispositivos y nunca será coherente.

Entonces tienes 2 opciones básicamente

1) Establezca el tamaño de la escena en 1024X768 (horizontal) o 768x1024 (vertical). Esta fue la configuración predeterminada en Xcode 7.

Por lo general, solo tiene / muestra un poco de fondo adicional en la parte superior / inferior (horizontal) o izquierda / derecha (vertical) en iPads que se recorta en iPhones.

Ejemplos de juegos que muestran más en iPads / crop en iPhones:

Altos Adventure, Leos Fortune, Limbo, The Line Zen, Modern Combat 5.

2) Apple cambió el tamaño de escena predeterminado en xCode 8 a iPhone 6/7 (750 * 1334-Portait, 1337 * 750-Landscape). Esta configuración recortará tu juego en iPads.

Ejemplos de juegos que muestran menos en iPads:

Lumino City, Robot Unicorn Attack

Elegir entre las 2 opciones depende de ti y depende del juego que estés haciendo. Por lo general, prefiero usar la opción 1 y mostrar más antecedentes en iPads.

Independientemente del tamaño de la escena, el modo de escala suele dejarse en la configuración predeterminada de .aspectFill.

Para ajustar cosas específicas como etiquetas, etc., puede hacerlo de esta manera

if UIDevice.current.userInterfaceIdiom == .pad { ... }

Puede probar la escena escalando usted mismo, crear un nuevo proyecto de juego de muestra SpriteKit. Ejecútelo en todos los iPhones y notará que la etiqueta HelloWorld se ve perfecta en todos los dispositivos.

Ahora cambie la configuración predeterminada a tamaño de escena = fotograma o use .ResizeFill, la etiqueta HelloWorld ya no se escala correctamente en todos los dispositivos.

Como nota al margen, la línea

if let scene = GameScene(fileNamed: "GameScene")

hace referencia al archivo GameScene.sks. Dijiste que haces todo programáticamente, por lo tanto, probablemente puedas eliminar el archivo GameScene.sks y cambiar la línea a

let skView = view as! SKView! let scene = GameScene(size: CGSize(width: 1024, height: 768)) // 768 x 1024 if portrait

Actualizar:

Ahora estoy usando una variante ligeramente diferente ya que tuve problemas para adaptar mi juego al iPhoneX. Configuré el tamaño de la escena en 1334x750 y uso el ajuste de aspecto como modo de escala. Debo ejecutar algún código para eliminar las barras negras si es necesario, por ejemplo, iPad o iPhone X, ya que prefiero mostrar más antecedentes. Se basa en este gran artículo.

http://endlesswavesoftware.com/blog/spritekit-skscene-scalemode/