Spritekit animation time de carga

Tengo un juego simple en el que he estado trabajando, una aventura espacial de desplazamiento lateral donde guardas gatos. Un juego muy simple, pero me encuentro con un problema. Mi juego comienza normalmente, mostrando la escena del menu principal. Hit play y su transición a la escena del juego sin problema, sin embargo, me doy count de que la primera vez que presiono el inicio para comenzar el juego, me sale un poco de retraso. Este retraso solo aparece la primera vez que carga el juego.

Al pulsar el inicio, se llama al siguiente método:

-(void)nonplayerSprites:(StartReason)endReason{ if (endReason == kStartGame){ // [self playMusic:@"Electrodoodle.mp3"]; [self spawnPlayer]; [self setupUI]; [self runAction:[SKAction repeatActionForever: [SKAction sequence:@[[SKAction performSelector:@selector(enemySpawn) onTarget:self], [SKAction waitForDuration:2.0]]]]]; [self runAction:[SKAction repeatActionForever: [SKAction sequence:@[[SKAction performSelector:@selector(spawnCat) onTarget:self], [SKAction waitForDuration:1.5]]]]]; [self runAction:[SKAction repeatActionForever: [SKAction sequence:@[[SKAction performSelector:@selector(powerUpSpawnCheck) onTarget:self],[SKAction waitForDuration:2.0]]]]]; } else if (endReason == kEndGame){ [self removeAllActions]; } else if (endReason == kRestartGame){ MainGame * myScene = [[MainGame alloc] initWithSize:self.size]; SKTransition *reveal = [SKTransition fadeWithDuration:0.5]; [self.view presentScene: myScene transition: reveal]; } } 

Tengo cuatro nodos sprite a los que llama, un OVNI, un gato, el cohete jugador y un encendido aleatorio. Se llaman dos SKLabelNodes para puntuación de jugador y total de vida a través del método spawnUI, y además, se reproducirá música. Aunque actualmente lo tengo desactivado.

El enemigo y los nodos amigos se llaman usando un método similar:

 -(void)enemySpawn { int enemyChoice = [self getRandomNumberBetween:0 to:1]; if (enemyChoice == 0){ _enemy = [SKSpriteNode spriteNodeWithImageNamed:@"enemy"]; [_enemy setScale:1.0]; }else if (enemyChoice == 1){ _enemy = [SKSpriteNode spriteNodeWithImageNamed:@"enemy_alt"]; [_enemy setScale:0.50]; } _enemy.anchorPoint = CGPointZero; _enemy.zPosition = 2.0; _enemy.name = @"rocket"; _enemy.position = CGPointMake(self.size.width + _enemy.size.width, [self getRandomNumberBetween:0 to:250]); SKAction *enemyMove = [SKAction sequence:@[[SKAction moveToX:-40 duration:[self getRandomNumberBetween:2 to: 5]], [SKAction removeFromParent]]]; [_worldNode addChild:_enemy]; [_enemy runAction:enemyMove]; } 

Siento que sé cuál es el problema, los datos del juego se cargan en RAM por primera vez, pero ¿cómo evito la pausa mientras se carga? Me pregunto si estoy haciendo algo mal, porque no parece que estoy cargando lo suficiente como para causar una notable pausa de 1 a 3 segundos al presionar el button de inicio. La segunda vez, digamos después de que el jugador muere y se reinicia, la pausa se ha ido y todo se desarrolla sin problemas. Me disculpo si le estoy omitiendo información importante, soy bastante nuevo en SpriteKit.

¿Alguien tiene pensamientos?

Gracias por adelantado.

Yo tuve el mismo problema.

Parece que cuando usas [SKSpriteNode spriteNodeWithImageNamed: @ "enemy"] o * [SKSpriteNode spriteNodeWithImageNamed: @ "enemy_alt"] * o cualquier otro método de carga de texturas, la textura no se almacena en búferes para un acceso rápido, por lo que la primera llamada de esos methods es dándote rezagos

La solución es la siguiente:

Agregue properties para las texturas de objects de juego

@property (nonatomic, strong) SKTexture * enemyTexture; . . .

agregar método a la subclass de escena:

 -(void)preloadTextures { self.enemyTexture = [SKTexture textureWithImageNamed:@"enemy"]; . . . . [SKTexture preloadTextures:@[self.enemyTexture,...] withCompletionHandler:^{ NSLog(@"Textures preloaded"); }]; } 

Ahora llame a ese método antes de presentar

 MainGame * myScene = [[MainGame alloc] initWithSize:self.size]; SKTransition *reveal = [SKTransition fadeWithDuration:0.5]; [myScene preloadTextures]; [self.view presentScene: myScene transition: reveal]; 

Espero que también te sirva el truco.