【问题标题】:Access property of current SKScene?访问当前 SKScene 的属性?
【发布时间】:2014-03-13 13:19:01
【问题描述】:

我正在测试几种不同的技术以集成到我的 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 的新手,这可能无济于事,而且项目的设置与我迄今为止的工作方式有很大不同(将场景拆分为自己的类,属性可以通过编程轻松访问)。

【问题讨论】:

    标签: ios objective-c sprite-kit


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2017-05-30
        • 1970-01-01
        • 2015-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多