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