2017-01-24 9 views
1

SceneEditorをレイアウト&に作成することは可能ですか?SKSpriteNodeの複雑なサブクラスを作成し、その情報を読み込み、sksファイルに基づいてシーン内にカスタムオブジェクトを作成します。 ?.sksファイルを使用して複雑なオブジェクトとSKSceneファイルをレイアウトする

私のシナリオでは、ダイアログ上に多くの子を持つポップアップダイアログ(これにはSKSpriteNodesのサブクラス以外)があります。 Scene EditorでSKSceneをレイアウトしたのと同じようにシーンエディタにレイアウトし、必要に応じてシーンに提示することを望んでいました。

私はGameScene.sksファイルにこのオブジェクトを作成することができますが、それらは簡単に乱雑になることがあり、各自のsksファイルを持っていればこれらのダイアログを保存するより良い方法かもしれないと考えました。

私はシーンファイルに似たファイルにアクセスするためにSKSpriteNodeを拡張しようとしましたが、それは

if let teamDialog = SKSpriteNode.spriteWithClassNamed(className: "TeamDialog", fileName: "TeamDialog.sks") { } 

extension SKSpriteNode { 

    static func spriteWithClassNamed(className: String, fileName: String) -> SKSpriteNode? { 

     guard let dialog = SKSpriteNode(fileNamed: fileName) else { 
       return nil 
     } 

     return dialog 
    } 
} 

enter image description here

答えて

1

あなたはこのデリゲートを使用することができます動作しませんでしたhttps://github.com/ice3-software/node-archive-delegate

または、SMT迅速なこのような:

class func unarchiveNodeFromFile(file:String)-> SKNode? { 
    if let path = NSBundle.mainBundle().pathForResource(file, ofType: "sks") { 
     var fileData = NSData.dataWithContentsOfFile(path, options: NSDataReadingOptions.DataReadingMappedIfSafe, error: nil) 
     var archiver = NSKeyedUnarchiver(forReadingWithData: fileData) 
     archiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKNode") 
     let node = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as SKNode 
     archiver.finishDecoding() 
     return node 
    } else { 
     return nil 
    } 
} 

スイフト3の更新とクラスキャスティングの修正:

func unarchiveNodeFromFile(file:String)-> SKNode? { 
    if let path = Bundle.main.path(forResource: file, ofType: "sks") { 
     let fileData = NSData.init(contentsOfFile: path) 
     let archiver = NSKeyedUnarchiver.init(forReadingWith: fileData as Data!) 
     archiver.setClass(SKNode.classForKeyedUnarchiver(), forClassName: "SKScene") 
     let node = archiver.decodeObject(forKey: NSKeyedArchiveRootObjectKey) as! SKNode 
     archiver.finishDecoding() 
     return node 
    } else { 
     return nil 
    } 
} 
+0

私はこれが機能するとは思わない。 sksファイルの最上位ノードは常にSKSceneになります。だから、NSKeyedUnarchiverを使用して私はSKSceneとしてファイルを取得することができます、私はこのアーカイブされていないシーンの子SpriteNodeを見つけることができますが、それはすでに親を持っています。シーンにシーンを追加することはできません。 –

+0

あなたは正しいです、シーンにシーンを追加することはできませんが、SKSceneはスーパークラスとしてSKNodeを持っているので、それを使用してこのオブジェクトをSKNodeとして追加することができます。それは私のためにかなりうまく動作します –

+0

私はいくつかの重要な要素やキャストを欠落している必要があります。あなたが提供した関数を使用していて、let wtf = MenuScene.unarchiveNodeFromFile(file: "TeamDialog")の場合に使用しています! SKNodeとして? { addChild(wtf) }シーンに追加するときにエラーが発生する キャッチされない例外のためにアプリを終了しています。 'Cant add body、既にworldに存在します'、理由: 'Cant add body タイプ: {名前: 'teamDialogScene'フレーム:{{ - 768、-1024}、{1536、2048}}アンカー:{0.5、0.5}]、既にワールドに存在します –

関連する問題