2014-02-13 269 views
1

我试图从我的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,我将非常感激。

回答

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

感谢您为我准备这个答案,但这是我通常会遵循的方法,它不起作用,因为在场景初始化时需要访问该变量。即看起来我需要继承'SKScene'来修改初始化方法,但是我找不到这样做的简单方法,因为SKScene和工厂子类之间的类初始化方法不同。 – Sarreph

+0

@Rorz看我的编辑。 –

+1

这似乎已经做到了,谢谢:) – Sarreph

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

这样做的好处是,你永远只加载纹理一次,你也不需要从现场通过他们周围到现场。这两种方法都是有效的,但是这提供了更好的代码封装,因为你的纹理加载代码现在都可以进入这个类,所以它处于中心位置。