¿Cuál es la mejor manera de manejar varios SKScenes?

Hice un juego usando el nuevo proyecto de juego predeterminado y luego inserté una UIView normal como la escena de introducción de la aplicación. Desde ‘actualicé’ la introducción al uso de SKScene, con botones que empujan al juego original ViewController a la stack. Parecía un poco lento una vez que se cargó la vista de juego, así que supongo que tiene que ver con la sobrecarga de tener 2 escenas completas y controladores de vista. Incluso puse en pausa la escena de aterrizaje, ¡pero obviamente seguirá usando memoria!

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

Configuración actual:

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

La aplicación ingresa en LandingViewController que se encuentra en LandingScene (y en los Sprites de UI de aterrizaje). LandingViewController maneja los eventos táctiles como botones, etc. Cuando se toca un juego nuevo, se empuja GameViewController (actualmente usando un Segue) y GameViewController en su escena, gamestate, UI, tablero de juego, etc. GameViewController maneja sus eventos táctiles para su escena. Cuando un juego finaliza (haga clic en el juego final o en el estado), GameViewController aparece.

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 turno de juego, etc. ¡Cualquier ayuda o sugerencia sería apreciada porque me gustaría hacer esto bien!

Tener un controlador de vista única y varias escenas

Podría usar el controlador de vista única (que en realidad es un estado predeterminado de la plantilla del juego SpriteKit) y tener varias escenas.

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

En GameViewController , inicializas tu escena por primera vez. Entonces ese es el punto donde inicializas tu LandingScene (supongo que ese es el lugar donde implementaste tu menú de navegación).

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

Transición

La transición en SpriteKit puede hacer generalmente 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 diseño” y que la escena actual debe notificar al controlador de vista sobre su estado listo para la transición, para que el controlador de vista pueda hacer transición necesaria Pero en respuesta a esto, estas son citas de documentos:

Transición entre dos escenas

Por lo general, la transición a una nueva escena se basa en la jugabilidad o la entrada del usuario. Por ejemplo, si el usuario presiona un botón en la escena del menú principal, puede hacer la transición a una nueva escena para configurar la coincidencia que el jugador quiere 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 arriba usando el patrón de delegación, donde la escena delega la responsabilidad de la transición al controlador de vista.

Ambas formas 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 Swift) mientras está en fase de desarrollo, para asegurarse de que todas las escenas estén desasignadas correctamente.