2013-12-10 1 views
1

понятия бытия в состоянии вернуться к предыдущей сцене, где вы остановились кратко упоминается здесь: https://developer.apple.com/library/ios/documentation/GraphicsAnimation/Conceptual/SpriteKit_PG/DesigningGameswithSpriteKit/DesigningGameswithSpriteKit.htmlSpriteKit - Возвращение к постоянной сцене в том же состоянии он был оставлен в

Другое, чем я могу. Не находите больше документации по этому вопросу. Я знаю, что в других средах, таких как Cocos2D, вы можете поп-сцены в стеке и даже иметь несколько сцен одновременно.

Как я могу заставить это работать в SpriteKit.

У меня есть игра с открытым меню для выбора персонажа. После выбора персонажа сцена переходит в другое меню. Я хочу, чтобы пользователи могли нажимать кнопку «Назад» и быть представлены с предыдущей сценой, где персонаж, который они выбрали, полностью отображается.

На данный момент я представляю предыдущую сцену как новую. Какая из причин создает его в новом состоянии, с первым символом в простом представлении, а не с символом, который они выбрали.

Это должно быть очень просто, но для всех моих поисковых запросов я не имею понятия о том, как это реализовать.

ответ

2

Я не знаю, проверяет ли кто-нибудь все это, но я считаю, что у меня есть другой способ решить проблему.

Я создал пользовательскую «PauseScene», и пользователь может установить сцену возврата, что означает, что когда вы будете готовы вернуться, представление PauseScene представляет сцену возврата. Вот код:

PauseScene.h

#import "MAScene.h" 

@interface PauseScene : MAScene 
@property (weak, nonatomic, readonly) SKScene * returnScene; 

-(void)setReturnScene:(SKScene *)otherScene; 


@end 

PauseScene.м

#import "PauseScene.h" 
#import "MASpriteButton.h" 


@interface PauseScene() 
@property (strong, nonatomic) MASpriteButton * resumeButton; 
@end 


@implementation PauseScene 


-(void)setReturnScene:(SKScene *)otherScene 
{ 
    _returnScene = otherScene; 
} 


-(void)didMoveToView:(SKView *)view 
{ 
    [self createContent]; 
} 

-(void)createContent 
{ 

    __weak typeof(self) weakMe = self; 

    MASpriteButton * resume = [[MASpriteButton alloc] initWithBackgroundImageNamed:@"cardback.png" andSelectedImageNamed:@"cardback.png" andCallbackBlock:^{ 

     NSLog(@"removing..."); 
     [weakMe.view presentScene:self.returnScene]; 
    }]; 

    resume.size = CGSizeMake(self.widthToHeightRatio * 20, self.heightToWidthRatio * 20); 
    resume.position = CGPointMake(self.size.width/2, self.size.height/2); 


    self.resumeButton = resume; 
    [self addChild:self.resumeButton]; 
    [self setBackgroundColor:[UIColor blueColor]]; 
} 


@end 

Как я использовал это было то, что, когда пользователь нажимает кнопку паузы в игровой сцене, я называю эти строки:

self.paused = YES; 
PauseScene * pScene = [[PauseScene alloc] initWithSize:self.size]; 
[pScene setReturnScene:self]; 
[self.view presentScene:pScene]; 

Обратите внимание, что self в этом маленьком блоке является игровой сценой ,

С учетом того, что сцена паузы удерживает слабый указатель на сцену игрового процесса, он может удерживать указатель на сцену возврата, не отбрасывая ее, когда сцена паузы отменена.

PS Класс MAScene - это лишь небольшое расширение класса SKScene, я просто добавил пару вещей к нему. Если кто-то хочет этого, просто дайте мне знать.

2

Предполагая, что сцена меню также реализована в комплекте Sprite, вы можете создать контроллер модального представления, представить его и поместить сцену Sprit Kit поверх этого модального вида.

Так, в частности, создайте новый класс наследования UIViewController MenuViewController и новый класс наследования SKScene, MenuScene. Класс «MenuScene» MenuScene должен быть сценой, которую вы хотите представить. Подключите MenuScene и MenuViewController, как обычно, подключите SKScene и его контроллер. Удостоверьтесь, что у вас есть контроллер представления исходной сцены в качестве свойства оригинала SKScene.

Везде, где вы хотите, чтобы представить это меню, вы можете позвонить из оригинального SKScene:

MenuViewController *modalViewController = [[MenuViewController alloc] init]; [self.viewController presentModalViewController:modalViewController];

Есть более простые способы справедливого перехода ч/б SKScene экземпляров, но если вы хотите сохранить intial SKScene работает в фоновом режиме, это то, что вам нужно будет делать, я считаю.

+0

У вас есть какие-либо ссылки на руководства или знать способ, которым может помочь получить контроллер модального просмотра, работающий в SpriteKit? Спасибо за помощь. –

+0

Хммм. Я никогда не делал этого лично, но я отредактирую свой пост, чтобы содержать какой-то код. – Monkeyanator

+0

Также проблема с этим методом заключается в том, как я собираюсь отправлять информацию из одного SKScene в следующий. Не нужно ли мне устанавливать свойства на то, что нажимается ViewController, а затем извлекать их в следующем SKView? Или, возможно, просто используйте NSUserDefaults. –

0

Вы просто должны держать сильный указатель на уходящую сцену, прежде чем назвать новый

Вот пример реализации с помощью одноточечного (на самом деле обычных одноточечного с указателем сцены, нет волшебного)

@interface Global : NSObject 

+ (Global*)sharedInstance; 

@property (strong, nonatomic) SKScene *mainScene; 
@end 

И ой файл

@implementation Global 

+ (instancetype) sharedInstance{ 
    static Global *_sharedInstance = nil; 

    static dispatch_once_t oncePredicate; 

    dispatch_once(&oncePredicate, ^{ 
     _sharedInstance = [[Global alloc] init]; 
    }); 
    return _sharedInstance; 
} 

@end