2014-02-13 100 views
1

我試圖從我的SpriteKit場景的UIViewController中將預加載的數組SKTexture傳遞到場景中,當它初始化時。將變量傳遞給SKScene

但是,我似乎無法自定義SKScene傳遞數組的初始化方法。

這就是我想要做的事:

@interface MyViewController() 

@property (nonatomic, strong) NSArray *texturePack; 

@end 

<>

- (void)viewWillLayoutSubviews 
{ 
    [super viewWillLayoutSubviews]; 

    // Configure the view. 
    SKView * skView = (SKView *)self.spriteView; 
    if (!skView.scene) { 
     skView.showsFPS = YES; 
     skView.showsNodeCount = YES; 

     // Create and configure the scene. 

     // Pass variable?* 

     MyScene *scene = [MyScene initWithSize:skView.bounds.size]; 

     scene.scaleMode = SKSceneScaleModeAspectFill; 

     // Present the scene. 
     [skView presentScene:scene];   

    } 

} 

* 我不知道它被初始化之前如何self.texturePack傳遞到現場嗎?

如果任何人在初始化時如何將變量傳遞給SKScene,我將非常感激。

回答

2

您必須在SKScene的子類中公開聲明該屬性。

@interface MyScene : SKScene 

@property (nonatomic, strong) NSArray *texturePack; 

@end 

然後,當你創建你的場景的實例。爲新聲明的屬性設置一個值。一旦你這樣做了,你可以從場景中的實例中訪問數組。

SKView * skView = (SKView *)self.spriteView; 
if (!skView.scene) { 
    skView.showsFPS = YES; 
    skView.showsNodeCount = YES; 

    MyScene *scene = [MyScene initWithSize:skView.bounds.size]; 
    [scene setTexturePack:someArrayReference]; 

    scene.scaleMode = SKSceneScaleModeAspectFill; 

    // Present the scene. 
    [skView presentScene:scene];   

} 

編輯:您是否想要創建一個自定義的初始化方法是把你的數組作爲參數?如果是這樣,請將其添加到場景子類中,並在場景標題中對其進行公開聲明。

- (instancetype)initWithSize:(CGSize)size andCustomParameter:(NSArray *)theArray { 
    self = [super initWithSize:size]; 

    if (self) { 
     // do something with the array on iniitialization 
    } 

    return self; 
} 
+0

感謝您爲我準備這個答案,但這是我通常會遵循的方法,它不起作用,因爲在場景初始化時需要訪問該變量。即看起來我需要繼承'SKScene'來修改初始化方法,但是我找不到這樣做的簡單方法,因爲SKScene和工廠子類之間的類初始化方法不同。 – Sarreph

+0

@Rorz看我的編輯。 –

+1

這似乎已經做到了,謝謝:) – Sarreph

1

如果我是你,我只想創建通過具有陣列作爲一個屬性一個單獨的類,你只要從那裏訪問。

//SharedTextures.h 
@interface SharedTextures : NSObject 
@property (strong, nonatomic)NSArray *textures; 
@end 

//sharedTextures.m 
+ (instancetype)sharedInstance{ 

    static dispatch_once_t onceToken; 
    static id sharedInst; 
    dispatch_once(&onceToken, ^{ 
    sharedInst = [[self alloc] init]; 
}); 
    return sharedInst; 
} 
- (id)init{ 
    self.textures = [self loadTextures] 
} 

現在,當有人想那些紋理,您可以撥打:

SharedTextures *shared = [SharedTextures sharedInstance]; 
SKTexture *texture = shared.textures[//indice of texture]; 

這樣做的好處是,你永遠只加載紋理一次,你也不需要從現場通過他們周圍到現場。這兩種方法都是有效的,但是這提供了更好的代碼封裝,因爲你的紋理加載代碼現在都可以進入這個類,所以它處於中心位置。