ios - SpriteKit pausa y resume SKView
objective-c sprite-kit (1)
Quiero pausar y reanudar una escena en SpriteKit, con 2 botones en la misma posición. Mientras la escena se está ejecutando, quiero mostrar el botón ''Pausa''. Mientras la escena está en pausa, quiero ocultar el botón ''Pausa'' y mostrar el botón ''Reproducir''. En SpriteKit puede usar self.scene.view.paused
que se define en SpriteKit.
Mi código:
@implementation MyScene {
SKSpriteNode *PauseButton;
SKSpriteNode *PlayButton;
}
-(id)initWithSize:(CGSize)size {
if (self = [super initWithSize:size]) {
[self Pause];
}
return self;
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
/* Called when a touch begins */
UITouch * touch = [touches anyObject];
CGPoint location = [touch locationInNode:self];
SKNode * Node = [self nodeAtPoint:location];
if([Node.name isEqualToString:@"PauseButton"]){
self.scene.view.paused = YES;
[PauseButton removeFromParent];
[self Resume];
}
if([Node.name isEqualToString:@"PlayButton"]){
self.scene.view.paused = NO;
[PlayButton removeFromParent];
[self Pause];
}
}
-(void)Pause{
PauseButton = [SKSpriteNode spriteNodeWithImageNamed:@"Pause.png"];
PauseButton.position = CGPointMake(self.frame.size.width / 2, self.frame.size.height / 1.04);
PauseButton.zPosition = 3;
PauseButton.size = CGSizeMake(40, 40);
PauseButton.name = @"PauseButton";
[self addChild:PauseButton];
}
-(void)Resume{
PlayButton = [SKSpriteNode spriteNodeWithImageNamed:@"Play.png"];
PlayButton.position = CGPointMake(self.frame.size.width / 2, self.frame.size.height / 1.04);
PlayButton.zPosition = 3;
PlayButton.size = CGSizeMake(60, 60);
PlayButton.name = @"PlayButton";
[self addChild:PlayButton];
}
Pausa la escena, pero todavía hay el botón de pausa, y si toco el botón de pausa nuevamente, la escena se reanuda. Entonces, ahora solo las imágenes no cambiarán. ¿Cómo puedo arreglar esto?
No puede actualizar el botón (o cualquier otra cosa en la escena) mientras el SKView está en pausa. En su método touchesBegan
, está pausando la vista antes de actualizar el botón (cambiar el orden no funcionará). Deberá volver al ciclo de ejecución para que su botón se actualice antes de pausar el juego. Aquí hay una manera de hacerlo:
Esto llama a un método para pausar la vista después de un breve retraso. Añada esto después de su instrucción [self Resume]
en touchesBegan
, y elimine self.scene.view.paused = YES
.
[self performSelector:@selector(pauseGame) withObject:nil afterDelay:1/60.0];
Este método pausa el SKView. Agregue esto a su MyScene.m
- (void) pauseGame
{
self.scene.view.paused = YES;
}