SpriteKit Пауза и возобновление работы SKView

Я хочу приостановить и возобновить сцену в SpriteKit с двумя кнопками в одном месте. Пока сцена работает, я хочу показать кнопку «Пауза». Пока сцена приостановлена, я хочу скрыть кнопку «Пауза» и показать кнопку «Воспроизведение». В SpriteKit вы можете использовать self.scene.view.paused, который определен в SpriteKit.

Мой код:

@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];

}

Это приостанавливает сцену, но кнопка паузы все еще есть, и если я снова коснусь кнопки паузы, сцена возобновится. Так что теперь только изображения не будут меняться. Как я могу это исправить?


person Community    schedule 01.09.2014    source источник
comment
Вам нужно вручную обновить кнопку до типа воспроизведения, при котором вы приостанавливаете сцену и наоборот.   -  person Woodstock    schedule 01.09.2014
comment
И как мне лучше это сделать? Я думал, что с BOOL он получит уведомление.   -  person    schedule 01.09.2014
comment
Проблема в том, что метод init вызывается только один раз! При инициализации! Вам нужно переместить код, который обрабатывает логическое обновление, в метод, который вызывается каждый раз, когда происходит пауза/воспроизведение. Вы понимаете?   -  person Woodstock    schedule 01.09.2014
comment
Понял, звоню теперь не один раз. Пауза и возобновление работают хорошо, но изображение не изменится.   -  person    schedule 01.09.2014


Ответы (1)


Вы не можете обновить кнопку (или что-либо еще в сцене), пока SKView приостановлен. В вашем методе touchesBegan вы приостанавливаете представление перед обновлением кнопки (изменение порядка не сработает). Вам нужно будет вернуться к циклу выполнения, чтобы ваша кнопка обновилась перед приостановкой игры. Вот один из способов сделать это:

Это вызывает метод для приостановки представления после небольшой задержки. Добавьте это после вашего оператора [self Resume] в touchesBegan и удалите self.scene.view.paused = YES.

    [self performSelector:@selector(pauseGame) withObject:nil afterDelay:1/60.0];

Этот метод приостанавливает SKView. Добавьте это в свой MyScene.m

- (void) pauseGame
{
    self.scene.view.paused = YES;
}
person 0x141E    schedule 01.09.2014