¿Cuál es la mejor manera de manejar múltiples SKScenes?

Hice un juego con el nuevo proyecto de juego pnetworkingeterminado y luego inserté una UIView normal como escena de introducción de la aplicación. Desde que "actualicé" la introducción al uso de un SKScene, con botones que empujan el juego original ViewController a la stack. Parecía un poco flojo una vez que se cargó la vista del juego, así que supongo que eso tiene que ver con la sobrecarga de tener 2 skscenes completos y ver controlleres. ¡Incluso puse la escena de aterrizaje en pausa, pero obviamente seguirá usando memory!

Mi pregunta es, ¿cómo puedo usar un SKScene como la página de destino (con su propio LandingViewController) y luego agregar eficientemente el GameViewController a la stack. Intenté combinar los controlleres de 2 vistas, pero parece una forma estúpida de hacer las cosas.

Configuración actual:

LandingViewController |-LandingScene GameViewController |- GameViewScene |- Other Game Classes 

La aplicación ingresa en LandingViewController que entra en el LandingScene (y aterriza UI Sprites). LandingViewController maneja los events táctiles como botones, etc. Cuando se toca el nuevo juego, GameViewController se presiona (actualmente usa un Segue) y GameViewController en su escena, estado de juego, interfaz de usuario, tablero de juego, etc. GameViewController maneja sus events táctiles para su escena. Cuando finaliza un juego (click juego final o juego sobre estado), se reinicia GameViewController.

Tanto LandingViewController como GameViewController controlan el flujo de sus animaciones y clics, etc, por lo que GameViewController hace la lógica del juego, como el próximo juego de turno, etc. ¡Cualquier ayuda o pointers sería apreciada ya que me gustaría hacerlo bien!

Tener un controller de vista única y varias escenas

Puede usar un controller de vista única (que en realidad es un estado pnetworkingeterminado de la plantilla de juego de SpriteKit) y tener varias escenas.

Entonces tendrás GameViewController y LandingScene , GameScene y posibles otras escenas, como la escena de LevelSelect o algo así.

En GameViewController , inicializas tu escena por primera vez. Entonces ese es el punto donde inicializas tu LandingScene (supongo que es el lugar donde implementaste tu menu de navigation).

Entonces, desde ese punto, puedes hacer una transición desde cualquier escena que quieras usando SKView's método presenteScene: (y opcionalmente usar la class SKTransition ) de SKTransition .

Transición

La transición en SpriteKit generalmente se puede hacer de dos maneras diferentes:

1. Algunos podrían decirle que hacer una transición de una escena actual a la siguiente escena es un "mal layout" y que la escena actual debería notificar al controller de vista sobre su estado listo para la transición, de modo que el controller de vista pueda hacer transición necesaria Pero en respuesta a eso, estas son citas de documentos:

Transición entre dos escenas

Normalmente, la transición a una nueva escena basada en el juego o la input del usuario. Por ejemplo, si el usuario presiona un button en la escena del menu principal, puede cambiar a una nueva escena para configurar la coincidencia que desea jugar.

Y el código relacionado:

 - (void)mouseUp:(NSEvent *)theEvent { [self runAction: self.buttonPressAnimation]; SKTransition *reveal = [SKTransition revealWithDirection:SKTransitionDirectionDown duration:1.0]; GameConfigScene *newScene = [[GameConfigScene alloc] initWithSize: CGSizeMake(1024,768)]]; [self.scene.view presentScene: newScene transition: reveal]; } 

Se puede ver claramente que la transición a la siguiente escena se realiza dentro de la escena actual.

2. Usando el método descrito anteriormente usando el patrón de delegación, donde la escena delega la responsabilidad de la transición al controller de vista.

Ambas forms están perfectamente bien, donde el primer método es un poco conveniente IMO, y ampliamente utilizado. Así es como puedes navegar entre diferentes escenas en SpriteKit de una manera fácil.

Insinuación:

No olvide anular el dealloc la escena (o deinit si usa el método Swift) mientras está en fase de desarrollo, para asegurarse de que todas las escenas se desasignen correctamente.