2013-12-10 20 views
1

概念能夠從上次中斷的地方恢復到以前的場景這裏簡要地提及:https://developer.apple.com/library/ios/documentation/GraphicsAnimation/Conceptual/SpriteKit_PG/DesigningGameswithSpriteKit/DesigningGameswithSpriteKit.htmlSpriteKit - 返回一個持久現場將其在相同的狀態

除此之外,我可以。在這個問題上找不到更多的文件。我知道在像Cocos2D這樣的其他框架中,您可以在堆棧中彈出場景,甚至可以同時運行多個場景。

我該如何在SpriteKit中使用它。

我與字符選擇揮動菜單遊戲。選擇一個角色後,場景變爲另一個菜單。我希望用戶能夠點擊後退按鈕並顯示前一個場景,其中他們選擇的角色處於全視角。

現在我已經把前一個場景作爲一個新場景呈現出來了。哪個原因造成它處於新鮮狀態,第一個字符是純視圖,而不是他們選擇的字符。

這應該很簡單,但對於我所有的使用Google,我沒有線索如何實現這一點。

回答

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 Kit中實現,您可以創建一個模式視圖控制器,呈現它,並將Sprit Kit場景放在該模式視圖上。

因此,具體而言,創建一個新的繼承類MenuViewController的UIViewController和一個新的SKScene繼承類MenuScene。類'MenuScene'MenuScene應該是你想要呈現的場景。掛鉤MenuSceneMenuViewController就像你通常會鉤住一個SKScene和其視圖控制器。請確保您有原始場景的視圖控制器作爲原始SKScene的屬性。

不管你想要去呈現這個菜單,你可以從原來的SKScene撥打:

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

有到B/W SKScene實例只是過渡更簡單的方法,但如果你想保持INTIAL SKScene在後臺運行,這是你必須做什麼,我相信。

+0

你有任何指南鏈接或知道的方式,可能有助於獲得一個模式的視圖控制器在SpriteKit工作? 感謝您的幫助。 –

+0

嗯。我從來沒有親自做過,但我會編輯我的帖子以包含一些代碼。 – Monkeyanator

+0

另外這個方法的問題是我如何去從一個SKScene發送信息到下一個。我不需要在ViewController上設置屬性,然後在下一個SKView上檢索它們嗎? 或者也許只是使用NSUserDefaults。 –

0

你剛纔應該保持強烈的指向離開現場打電話之前新

這裏是例如實現通過單(實際上通常單與現場指針,沒有魔法)

@interface Global : NSObject 

+ (Global*)sharedInstance; 

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

而且.M文件

@implementation Global 

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

    static dispatch_once_t oncePredicate; 

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

@end