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

4

シーン ファイルと .sks ファイルの接続の例は、デフォルトの SK ゲーム テンプレートに示されています。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 エディターに配置されたノードにアクセスし、それらをコードで使用する手順は次のとおりです。

  1. SKS エディターで SKspriteNodes を配置して名前を付ける
  2. 「GameWorld」ノードに名前を付けてシーンを列挙し、SKS ノードをノードの新しいインスタンス (SKSpriteNode) に置き換え、古い 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 に答える
0

.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;
于 2014-06-13T19:47:17.140 に答える