2017-03-18 13 views
3

私はブレイクアウトタイプのゲームに取り組んでいます。別のシーン(PaddleScene.sks)でパドルを作成したので、複数のレベルで参照することができました。それがまだ完了しているかどうかはまだ分かりませんが、まだ初心者です。Swiftを使用してSpriteKitの外部ノードをインポートします

私はSKReferenceNodeを通じてGameScene.sks内のパドルを追加して、このようなコードでそれを参照:

paddle = self.childNode(withName: "//paddle") as! SKSpriteNode 

これは動作しますが、問題はそれがPaddleScene.sks内側の位置であるため、今paddle.position.xは、私に0を与えることです。ですから、私はSKReferenceNodeを使ってGameScene内の位置を取得しなければなりません。

paddleRef = self.childNode(withName: "paddleScene") as! SKReferenceNode 

ここでは、1つではなく2つの変数を把握する必要があります。複数の変数を持たずにシーン内の外部オブジェクトを簡単にインポートする方法はありますか?

答えて

1

パドルの作成に使用するコードを投稿できますか? GameSceneのパドルを参照するために使用するコードもありますか?

参照ノード(あなたの場合はパドル)は、SKReferenceNodeの子ノードです。これは、あなたのパドル割り当てラインが読まなければならないことを意味します

let paddle = paddleRef.childNode(withName: "paddle") 

その後、あなただけのパドルではなくpaddleRefで作業する必要があるはずです。

また、パドル専用のクラスをSKSpriteNodeのサブクラスとして作成します。それはパドルに関連するすべてのものを扱います - 位置、回転、サイズ、透明度、画像、色合いなどを扱います。

次に、あなたのシーンでパドルを再利用するのは本当に簡単です。そのようなシーンコード、内のこのクラス:

let paddle = Paddle() 

(私はあなたのパドルクラス「パドル」という名前を付けますと仮定)。次に、あなたは1つのオブジェクトのみを扱っています。あなたのパドルのプロパティはうまくいきます - paddle.position、paddle.zRotation、paddle.sizeなど

パドルクラスの設定方法の助けが必要な場合は、知っている。

Stoyan

+0

このため@SimonePistecchiaに行きます。彼は、他のデータがSKSpriteNode以外であれば、彼のパドルをサブクラスとしてセットアップすることができますが、彼のSksファイルからSKReferenceNodesをインポートすることに関する彼の質問には答えません。 –

+1

Point taken。私は彼がScene Editorを使用する可能性を見落としました。私は今、適切な答えを提供することを願っています。それを指摘してくれてありがとう! – Stoyan

+0

パドルだけをホストするカスタムディメンションで別のシーンを作成しました。私は、コードを使用していないので、視覚化がより簡単になると考えていました。その後、パドルを参照するために、メインシーンのReferenceオブジェクトを使用して、ビジュアルエディタを最大限に活用し、変更を簡単にしました。それはどういう意味で間違っていますか?それともパフォーマンスの問題を引き起こしますか?代わりにSKSpriteNodeのサブクラスとして作成することをお勧めしますか? – Norbert

1

私は最近、(ほとんど)すべてのためのシーンエディタを使用して開始し、私は私のオブジェクトのための視覚的なレイアウトを持つ愛します。複雑なオブジェクト(シーンだけでなく)のシーン(sks)ファイルを作成し、リファレンスノードを使用してそれらをシーンファイルに配置するので、それらを複数のシーンで再利用したり、レイアウトを視覚的に見ることができます。私は実際に二重参照の周りに方法を見つけたことはありませんが、これはコード内の参照ノードを処理する方法です。このメソッドを使用すると、シーンエディタでレイアウトすることができますが、余分なオブジェクトを気にすることなく、位置を取得できます。

if let paddleReference = self.childNode(withName: "paddle") as? SKReferenceNode { 

    let paddleNode = paddleReference.getBasedChildNode() as? SKSpriteNode 

    self.paddle = paddleNode?.copy() as! SKSpriteNode 
    paddle.position = (paddleReference.position) 
    addChild(paddle) 
    paddleNode?.removeFromParent() 
    print("paddle.position \(paddle.position)") 
} 


extension SKReferenceNode { 

    func getBasedChildNode() -> SKNode? { 
     if let child = self.children.first?.children.first { return child } 
     else { return nil } 
    } 
} 

クレジットは彼の質問に答えていない、この拡張Add SKReferenceNode/SKScene to another SKScene in SpriteKit

+0

これはクールなトリックであり、今後も確実に使用しますが、パドルを別の 'SKSpriteNode'クラスでコーディングすることにしました。 – Norbert

+0

それはいいです、このコードはまだ関連しています。私はほとんどのアイテムをサブクラス化し、シーンノードの下の次のルートオブジェクトのskのクラスをサブクラスに変更します。そして、コードでgetBasedChildNodeでそれを探しているときに、あなたのサブクラスとしてキャストしてください。私はあなたの質問があなたがそれをサブクラス化したかどうかを述べなかったので、例の中にSKSpriteNodeを置くだけです –

関連する問題