将变量传递给SKScene

时间:2014-02-13 16:35:40

标签: ios objective-c sprite-kit

我正在尝试从我的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有任何建议,我将非常感激。

2 个答案:

答案 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];

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