将变量传递给SKScene

我正在尝试从我的SpriteKit场景的UIViewController传递一个预加载的SKTexture数组,当它初始化时进入场景。

但是,我似乎无法自定义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有任何建议,我将非常感激。

您必须在SKScene的子类中公开声明该属性。

 @interface MyScene : SKScene @property (nonatomic, strong) NSArray *texturePack; @end 

然后,当您创建场景的实例时。 将值设置为新声明的属性。 完成此操作后,您可以在场景实例中访问该arrays。

 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; } 

如果我是你,我会创建一个单例类,它将该数组作为属性传递,你只需从那里访问它。

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

这样做的好处是你只需要加载一次纹理,而不需要在场景之间传递它们。 这两种方法都是有效的,但这提供了更好的代码封装,因为纹理加载代码现在都可以进入这一个类,因此它位于一个中心位置。