当前SKScene的访问属性?

时间:2014-03-13 13:19:02

标签: ios objective-c sprite-kit

我正在测试一些不同的技术,以集成到我的Sprite Kit驱动的游戏中,而且我对我确信这是一项简单的任务感到磕磕绊。

我正在使用的测试项目是将Spine与Sprite Kit集成的框架的一部分。所有内容都包含(并定义)在一个ViewController中(根据当前选择UISegmentedControl的哪个选项创建四个视图之一)。在屏幕的底部,我有UISwitch,它与某个动作相关联:

-(IBAction)changeCostume:(UISwitch *)sender {

    if(sender.on) {
        NSLog(@"New costume");

    } else {
        NSLog(@"Old costume");
    }
}

我正在处理的场景定义如下:

+ (SKScene *) buildAvatarWithSize:(CGSize) size
{
    SpineSkeleton *avatar = [DZSpineSceneBuilder loadSkeletonName:@"test-avatar" scale:1]; //json
    spSkeleton_setSkinByName(avatar.spineContext->skeleton, "test-avatar");
    spSkeleton_setSlotsToSetupPose(avatar.spineContext->skeleton);

    DZSpineSceneDescription *sceneDesc = [DZSpineSceneDescription description];

    ... define animations etc. here...

    NSArray *nodes = [sceneDesc buildScene];

    SKNode *placeHolder = [SKNode node];
    placeHolder.position = CGPointMake(100, size.height);

    placeHolder.name = @"root";

    ... more setup code...

    SKScene *scene = [[SKScene alloc] initWithSize:size];
    scene.scaleMode = SKSceneScaleModeAspectFill;
    scene.backgroundColor = [UIColor whiteColor];

    [scene addChild:placeHolder];

    return scene;
}

我要访问的属性是sceneDesc - 我需要在按下UISwitch时动态修改其内容。我知道可以在场景设置代码中进行,但是一旦场景出现在屏幕上,我就无法弄清楚如何这样做。

更改此属性的值将更改各个节点中使用的SKTexture

我仍然不熟悉Objective-C,并且项目的设置与我迄今为止的工作方式有很大的不同(将场景分成他们自己的类,具有以下属性:可以通过编程方式轻松访问。

2 个答案:

答案 0 :(得分:1)

按下开关时,您可以使用NSNotificationCenter向场景发送消息。

答案 1 :(得分:-1)

我实际上放弃了尝试以编程方式访问sceneDesc,并且只是更改了相关SKSpriteNode的纹理:

SKSpriteNode *root = (SKSpriteNode *)[placeHolder.children[0] childNodeWithName:@"root"];

SKSpriteNode *arm = (SKSpriteNode *)[root childNodeWithName:@"upper arm"];

SKSpriteNode *upperArm = (SKSpriteNode *)[arm childNodeWithName:@"upper arm"];
SKSpriteNode *lowerArm = (SKSpriteNode *)[[arm childNodeWithName:@"bone3"] childNodeWithName:@"lower arm"];

upperArm.texture = [SKTexture textureWithImageNamed:@"blue_sleeve_upper"];
lowerArm.texture = [SKTexture textureWithImageNamed:@"blue_sleeve_lower"];