ios - que - spritekit swift 4
Agregar UITextView a una escena en SpriteKit (2)
Intento crear un juego y, siguiendo el consejo de Apple, estoy usando varias escenas. Podría considerar que el juego es un punto de texto pesado y haga clic en aventura.
Ahí yace el problema. Mucho texto, después de haber hecho un poco de búsqueda, parece ser la manera recomendada, o mejor dicho, la única forma actual de hacerlo es con una UITextView
así:
[self.view addSubview: textView];
Todo esto está muy bien si solo tienes un SKScene
, ya que esa es la escena que se muestra en la vista / SKView actual.
Mi problema es que cuando agrego el texto a la vista * de mi escena, que no es la primera escena que cargó la aplicación (es la tercera, o superior), la aplicación salta a la primera escena que cargó (que es mi menú) escena) y felizmente muestra el texto requerido.
Alguien tiene alguna idea de por qué? Tengo la transición de la escena del menú a la escena uno, a la escena dos (en la que deseo mostrar la prueba).
Por favor, no digas que necesito una vista por escena si quiero mostrar más de un puñado de palabras por escena, eso simplemente no tiene sentido, pero quizás tampoco mi uso de SpriteKit.
Todavía estoy algo asombrado de que no haya un SK equivalente al UITextView
.
De todos modos, cualquier ayuda, los indicadores serían geniales, gracias.
Bien, aquí están las partes relevantes del código ... Creo. Controlador:
- (void)viewWillLayoutSubviews
{
[super viewWillLayoutSubviews];
// Configure the view.
SKView *skView = (SKView *)self.view;
skView.showsFPS = YES;
skView.showsNodeCount = YES;
skView.showsDrawCount = YES;
// Create and configure the scene.
SKScene *scene = [[GTMainMenu alloc] initWithSize:skView.bounds.size];
// Present the scene.
[skView presentScene:scene];
}
donde GTMainMenu
es una subclase de SKScene
, y tiene un botón (cuadro naranja) para un "acto" (una subclase de GTScene
, una subclase de SKScene
), esto provocará una transición al acto, que tiene otro botón al primero escena. Solo que nunca viewDidLoad
a la escena, ya que viewDidLoad
te regresa al menú principal.
Esta es la viewDidLoad de la escena, que hará que "salte" de nuevo al menú principal:
- (void)didMoveToView:(SKView *)view
{
[super didMoveToView:view];
if (!self.contentCreated) {
[self createSceneContents];
self.contentCreated = YES;
}
UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(self.size.width/2, self.size.height/2+20, 200, 40)];
textView.center = self.view.center;
textView.textColor = [UIColor blackColor];
textView.font = [UIFont systemFontOfSize:17.0];
textView.backgroundColor = [UIColor whiteColor];
textView.text = @"Where am I?";
[self.view addSubview:textView];
}
Hay un repositorio git disponible aquí .
Esta es una versión rayada de mi proyecto, eliminando todo lo que no está relacionado con el tema en cuestión.
Si disculpa el código, mi trabajo diario es Java, y estoy luchando con ciertos conceptos en Objective C en este momento. Ah, y lo lamenté, logré incluir la configuración de los usuarios: S
El método viewWillLayoutSubviews de su controlador de vista no está protegido contra ejecuciones repetidas. Este método no solo se ejecutará en el momento del lanzamiento de la aplicación, sino también cada vez que la vista gire y cambie de tamaño.
Agregue un cheque antes de crear / presentar una escena en ese método:
if(self.view.scene == nil) { /* present scene */ }
¿Has mirado en SKLabelNode ? Lo usé extensamente en mi juego SpriteKit. Si necesita que su SKLabelNode haga algo sofisticado (física, etc.), simplemente puede agregarlo a un SKSpriteNode principal.