将变量传递给SKScene
问题描述:
我试图从我的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,我将非常感激。
答
您必须在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;
}
答
如果我是你,我只想创建通过具有阵列作为一个属性一个单独的类,你只要从那里访问。
//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];
这样做的好处是,你永远只加载纹理一次,你也不需要从现场通过他们周围到现场。这两种方法都是有效的,但是这提供了更好的代码封装,因为你的纹理加载代码现在都可以进入这个类,所以它处于中心位置。
感谢您为我准备这个答案,但这是我通常会遵循的方法,它不起作用,因为在场景初始化时需要访问该变量。即看起来我需要继承'SKScene'来修改初始化方法,但是我找不到这样做的简单方法,因为SKScene和工厂子类之间的类初始化方法不同。 – Sarreph
@Rorz看我的编辑。 –
这似乎已经做到了,谢谢:) – Sarreph