【问题标题】:using sks file with SKScene subclass使用带有 SKScene 子类的 sks 文件
【发布时间】:2014-08-04 10:52:20
【问题描述】:

我很高兴看到您在 Xcode 6 中使用 SKS 编辑器可以做的所有事情。我可以在 sks 编辑器中布置一些精灵、灯光、法线等。然后我可以像这样在我的视图控制器中加载 sks 文件:

-(void)viewWillLayoutSubviews {
    [super viewWillLayoutSubviews];

    // Configure the view.
    SKView * skView = (SKView *)self.view;
    if (!skView.scene) {
        skView.showsFPS = YES;
        skView.showsNodeCount = YES;

        NSString *scenePath = [[NSBundle mainBundle] pathForResource:@"MyScene" ofType:@"sks"];
        SKScene *scene = [NSKeyedUnarchiver unarchiveObjectWithFile:scenePath];
        [skView presentScene:scene];
        self.scene = scene;
    }
}

但是我看不到如何将任何代码绑定到 sks 文件。例如,我有 MyScene.sks(名为 MyScene)。然后我创建了类文件 MyScene.h 和 MyScene.m,以便我可以通过编程方式控制场景。但是,当我放置断点 MyScene.m 时,它们都没有到达。

如何将 MyScene.h/m 绑定到 MyScene.sks?

问这个问题的另一种方式。在 MyScene.sks 中,我有一个背景纹理(在编辑器中命名为 background)和一个灯光(在编辑器中命名为 light1)。我想以编程方式移动灯光。我希望我能够创建 MyScene.h/m,覆盖 touchesBegan/touchesMoved,并调整灯光的位置。当我添加此代码时,它从未执行过。为什么?

【问题讨论】:

  • 我建议查看 WWDC 2014 Session 608:Best Practices for Building SpriteKit Games,详细了解如何使用 .sks 文件。

标签: ios sprite-kit xcode6 scenekit


【解决方案1】:

要引用在您的 .SKS 文件中创建的节点,请使用以下 SWIFT 代码。

let sprite = childNodeWithName("NameOfNodeInSceneEditor")

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    默认 SK 游戏模板中提供了场景文件与 .sks 文件的连接示例。 GameViewController 为此有一个类别“SKScene (Unarchive)”。

    + (instancetype)unarchiveFromFile:(NSString *)file {
        /* Retrieve scene file path from the application bundle */
        NSString *nodePath = [[NSBundle mainBundle] pathForResource:file ofType:@"sks"];
        /* Unarchive the file to an SKScene object */
        NSData *data = [NSData dataWithContentsOfFile:nodePath
                                          options:NSDataReadingMappedIfSafe
                                            error:nil];
       NSKeyedUnarchiver *arch = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
       [arch setClass:self forClassName:@"SKScene"];
        SKScene *scene = [arch decodeObjectForKey:NSKeyedArchiveRootObjectKey];
        [arch finishDecoding];
    
        return scene;
    }
    

    您可以在自己的类中实现相同的类别。

    然后你只需调用:

    MyScene *scene = [MyScene unarchiveFromFile:@"MyScene"];
    

    【讨论】:

    • 完美!但是我在默认游戏模板中看不到该代码。 XCode 6b1 排除了 SpriteKit 模板,取而代之的是支持 SceneKit 的 Game 模板。无论如何,这正是我想要的。谢谢。
    • 正是我想要的。我刚刚意识到,当您使用 Xcode6 创建游戏模板时,您可以选择 SpriteKit 而不是 SceneKit。非常感谢。
    【解决方案3】:

    您不会为 .sks 文件(sprite Kit 场景)构建头文件或方法 (.h/.m) 文件。

    要配置此文件的各个方面,您可以使用 Scene 方法。根据我的经验,如果您使用 .sks 文件,您会受到配置数量的限制。手动创建粒子效果更好。

    因此,您需要使用 GestureRecognizers 而不是 touchesBegan。在您初始化此 MyScene.sks 的同一位置,您需要执行以下操作:

    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
    NSMutableArray *gestureRecognizers = [NSMutableArray array];
    [gestureRecognizers addObject:tapGesture];
    [gestureRecognizers addObjectsFromArray:scene.gestureRecognizers];
    scene.gestureRecognizers = gestureRecognizers;
    

    【讨论】:

    • 所以你是说在 sks 文件中创建的任何东西都是“愚蠢的”,也就是说它不能在 SKScene 子类中以编程方式访问?您能否举例说明“场景方法”的含义?我从来没有真正使用过 SpriteKit。我一直在关注一些教程。
    【解决方案4】:

    以下是访问放置在 SKS 编辑器中的节点并在您的代码中使用它们的步骤:

    1. 在 SKS 编辑器中定位和命名 SKspriteNodes
    2. 命名您的“GameWorld”节点并枚举您的场景,用新的节点实例 (SKSpriteNode) 替换 SKS 节点并删除旧的 sks 节点。

    请看下面的例子:

            self.gameWorld!.enumerateChildNodesWithName("Can") {
            node, stop in
    
            if let can = node as? SKSpriteNode {
    
                println("can found")
                self.newCan = SKSpriteNode(imageNamed: "MetalGarbageCan")
    
                self.gameWorld!.addChild(self.newCan!)
                println("new can added")
                self.newCan!.position = can.position
                self.newCan!.name = can.name!
                self.newCan!.size = can.size
                self.newCan!.zPosition = can.zPosition
    
                can.removeFromParent()
    
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-10
      • 1970-01-01
      相关资源
      最近更新 更多