1

我很高兴看到你可以在 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,并调整灯光的位置。当我添加此代码时,它从未执行过。为什么?

4

4 回答 4

6

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

let sprite = childNodeWithName("NameOfNodeInSceneEditor")

希望这可以帮助。

于 2014-09-04T09:48:57.187 回答
4

默认 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"];
于 2014-06-17T00:11:37.403 回答
0

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

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

因为这个,你会想要 doGestureRecognizers而不是 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;
于 2014-06-13T19:47:17.140 回答
0

以下是访问放置在 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()

        }
    }
于 2015-01-04T01:11:49.020 回答