使用SKScene子类的sks文件

我很想知道你可以用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中,我有一个背景纹理(在编辑器中命名为背景)和一个灯(在编辑器中命名为light1)。 我想以编程方式移动光线。 我希望我能够创建MyScene.h / m,覆盖touchesBegan / touchesMoved,并调整灯光的位置。 当我添加这段代码时,它从未执行过。 为什么?

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

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

 let sprite = childNodeWithName("NameOfNodeInSceneEditor") 

希望这可以帮助。

您没有为.sks文件(精灵工具包场景)构建标头或方法(.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编辑器中的节点并在代码中使用它们的步骤:

  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() } }