2017-06-14 11 views
1

私はスプライトを完全にコードで作ることができますが、私はspriteをgamescene.sksに配置し、それをgamescene.swiftで参照してIBOutletのように変更します。IBOutletのようにコードでgamescene.sksに追加されたスプライトをどのように参照しますか?

私はgamescene.sksに「ビーム」という名前のスプライトでこれを行うことができました:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    let touch = touches.first 
    let touchLocation = touch!.location(in: self) 
    let beam = childNode(withName: "beam") as! SKSpriteNode 

    if let body = physicsWorld.body(at: touchLocation) { 
     if body.node!.name == "leftTap" { 

       beam.rotateBy(CGFloat(10)) 
       print("Began touch on Left") 

     }else if body.node!.name == "rightTap"{ 

       beam.rotateBy(CGFloat(-10)) 
       print("Began touch on right") 

     } 
    } 
} 

} 

let beam = childNode(withName: "beam") as! SKSpriteNode 

そして、それは動作しますが、私は当初gamescene.sksにスプライトを配置ここでそれを参照しました。私はこの行配置するときしかし:私はそれを変更したとき、私はエラーを取得する

let beam = SKSpriteNode(withName: "beam") as! SKSpriteNode 

を、その後:gamescene.swiftのどこにも

let beam = childNode(withName: "beam") as! SKSpriteNode 

を、それは私がこれまでそれを変更する必要があるというエラーよりもスロー"引数ラベル '(withName :)は使用可能なオーバーロードと一致しません"

私はスプライトキットを初めて使い、いくつかのアドバイスをいただければ幸いです!

答えて

2

なぜあなたはタッチで、ローカル変数にスプライトを入れ、コードで

private var someObject = SKSpriteNode() 

override func didMove(to view: SKView) { 

    if let someObjectNode = self.childNode(withName: "//someObject") as? SKSpriteNode { 
     someObject = someObjectNode 
     someObject.zPosition = 50 
    } 
} 

をそのローカル変数を参照するとしようとしないだけでSomeObjectのを参照する代わりに、gameScene内のオブジェクトのすべての時間を探し始めました。

+0

ありがとうございました!私がgamescene.sksでスプライトに付けた名前であるはずの "// someObject"ですか?何が2つあるのですか? – genericguy25

+0

はい、これはSKSシーンファイルで名前を付けたものです。 //は、すべての子を走査し、別のオブジェクト内にネストされているかどうかにかかわらず、この名前に一致する子を見つけます。 –

+0

私はこれを試してみます、ありがとう! – genericguy25

1

あなたはこれが動作しない場合は、してみてください、あなたのコンパイラがエラーに

lazy var beam = self.childNode(withName: "beam") as! SKSpriteNode

を投げている理由である、怠惰な変数としてそれを行うにはselfがまだ存在していない必要があります。

lazy var beam = { return self.childNode(withName: "beam") as! SKSpriteNode}()

lazyは、変数がinitの間ではなく必要なときに読み込まれるようにします。

ローカル変数として実行するのではなく、このアプローチを行う理由は、最適化のためです。シーンを毎回検索するのは時間がかかりますが、一度検索を行うのは明らかではありません。

+0

ありがとう、これは本当に役に立ちます! – genericguy25

+0

私はあなたが示唆した両方の方法を試してみました。「gameSceneにはメンバーchildNodeエラーはありません」 – genericguy25

+0

あなたはsksceneではないgamesceneに問​​題があります – Knight0fDragon

関連する問題