我正在尝试从我的SpriteKit场景的SKTexture
传递一个预加载的UIViewController
数组,当它初始化时进入场景。
但是,我似乎无法自定义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有任何建议,我将非常感激。
答案 0 :(得分: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;
}
答案 1 :(得分: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];
这样做的好处是你只需要加载一次纹理,而不需要在场景之间传递它们。这两种方法都是有效的,但这提供了更好的代码封装,因为纹理加载代码现在都可以进入这一个类,因此它位于一个中心位置。