2014-08-27 64 views
2

每當我想要轉換到某個場景時,在SKTransition甚至開始之前需要幾秒鐘的時間。遊戲開始之前是否可以初始化所有場景?如何初始化Sprite Kit中的所有場景?

NewScene *newScene = [NewScene sceneWithSize:self.size]; 
SKTransition *reveal = [SKTransition moveInWithDirection:SKTransitionDirectionUp duration:0.5]; 
reveal.pausesIncomingScene = NO; 
[self.view presentScene:newScene transition:reveal]; 

我已經didMoveToView試過這還有:

@implementation NewScene 
-(id)initWithSize:(CGSize)size { 
    if(self = [super initWithSize:size]) { 
    // Load a bunch of stuff like this: 
    SKSpriteNode *menuButton = [SKSpriteNode spriteNodeWithImageNamed:@"mainMenu"]; 
    menuButton.position = CGPointMake(self.frame.size.width/2,self.frame.size.height/4); 
    menuButton.name = @"menuButton"; 
    [self addChild:menuButton]; 
    [menuButton setScale:0.8]; 
    } 
} 

我怎樣才能確保我的雪碧套件遊戲運行流暢?

編輯: 事實證明,問題是我不斷讓主線睡覺淡出音樂。我已將所有音頻方法在後臺運行並且現在工作正常。

+1

你能告訴你用「加載一堆東西」的評論取代了什麼?如果需要,您不應該在創建場景時遇到任何問題,而且如果是的話,您應該重新考慮處理數據/加載資源的方式。您可以從儘可能多的異步處理開始,並[預加載紋理](https://developer.apple.com/Library/ios/documentation/SpriteKit/Reference/SKTexture_Ref/Reference/Reference.html#//apple_ref/ OCC/CLM/SKTexture/preloadTextures:withCompletionHandler :)。 – 2014-08-27 11:52:55

+0

@ 0x7fffffff - 編輯我的文章。我嘗試了預加載紋理(在Stack Overflow上使用了另一個答案),但結果沒有改變。我可能在新場景中加載了錯誤的紋理。也許你可以告訴我如何在新場景中加載紋理? – Deeyennay 2014-08-27 12:10:36

回答

3

一個好方法是在SKScene的初始化之前異步加載所有資源。蘋果公司使用在Adventure game這種方法:

NewScene.h:

typedef void (^AGAssetLoadCompletionHandler)(void); 

@interface GameScene : SKScene<SKPhysicsContactDelegate, UIGestureRecognizerDelegate> 

+ (void)loadSceneAssetsWithCompletionHandler:(AGAssetLoadCompletionHandler)handler; 

@end 

NewScene.m:

@implementation NewScene 

-(id)initWithSize:(CGSize)size { 
    if(self = [super initWithSize:size]) { 
    // Load a bunch of stuff like this: 
    SKSpriteNode *menuButton = [SKSpriteNode spriteNodeWithTexture:[self menuButtonTexture]; 
    menuButton.position = CGPointMake(self.frame.size.width/2,self.frame.size.height/4); 
    menuButton.name = @"menuButton"; 
    [self addChild:menuButton]; 
    [menuButton setScale:0.8]; 
    } 
} 

#pragma mark - Shared Assets 

+ (void)loadSceneAssetsWithCompletionHandler:(AGAssetLoadCompletionHandler)handler { 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
     // Load the shared assets in the background. 
     [self loadSceneAssets]; 

     if (!handler) { 
      return; 
     } 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      // Call the completion handler back on the main queue. 
      handler(); 
     }); 
    }); 
} 

+ (void)loadSceneAssets { 
    sBackgroundTexture = [SKTexture textureWithImageNamed:@"background"]; 
    sMenuButtonTexture = [SKTexture textureWithImageNamed:@"mainMenu"]; 
    // etc. 
} 

static SKTexture *sBackgroundTexture = nil; 
- (SKTexture *)backgroundTexture { 
    return sBackgroundTexture; 
} 

static SKTexture *sMenuButtonTexture = nil; 
- (SKTexture *)menuButtonTexture { 
    return sMenuButtonTexture; 
} 

@end 

然後就目前NewSceneUIViewController

if (!self.skView.scene) { 
    CGSize viewSize = self.view.bounds.size; 
    // Here you can present some loading scene or splash screen 

    [NewScene loadSceneAssetsWithCompletionHandler:^{ 
     NewScene *scene = [[NewScene alloc] initWithSize:viewSize]; 
     [self.skView presentScene:scene transition:[SKTransition crossFadeWithDuration:1.f]]; 
    }]; 
} 
相關問題