2017-06-11 9 views
0

私はSpriteKitベースとスウィフト3にギャラガスタイルのゲームを書いていると私はタイプ 'SKNode'の値を 'SKSpriteNode!'と入力できません。

Cannot assign value of type '[SKNode]' to type 'SKSpriteNode!'

は、誰もが、私は将来的にはそれを自分自身を修正しても与えることができるように、これは何を意味するのか説明できますというエラーを取得しておきます私は可能な解決策ですか?ここで

は、私はエラーを取得する機能です。

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 

    for touch in touches { 
     let location = (touch as UITouch).location(in: self) 
     if fireButton = self.nodes(at: location) { 
      shoot() 
     } else { 
      let touchLocation = touch.location(in: self) 
      spaceship.position.x = touchLocation.x 
     } 
    } 
} 

私はlocationを交差するすべてのSKNodesの配列を返しますself.nodes(at: location)if fireButton = self.nodes(at: location)

+0

このSKNodeにSKSpriteNodeクラスを型キャストする必要があります。私はObj-Cでそれを行う方法のみを知っていますが、私は素早く(まだ)分かりません。 – TheFlyingProgrammer

+0

何か型変換するのはどういう意味ですか? – Shock9616

答えて

0

機能付きの行にエラーが発生します。このエラーは、単一のノードのみを参照する変数にSKNodeの配列全体(つまり[SKNode])を割り当てようとしているために発生します。

はまたself.nodes(at: location)戻り特定の場所を交差するすべてのノードいるので、あなたが探しているノードを見つけるために、ノードの配列を反復処理する必要があることに注意してください。配列を反復処理するには

、私は

​​

そして、あなたはfireButton

fireButton.name = "fireButton" 
// just an exmaple, rather store these names as constants somewhere in your code 
のように、名前を割り当てる宣言する場所でとライン

if fireButton = self.nodes(at: location) { 
     shoot() 
} 

を交換することをお勧め

これは最も簡単な方法ですが、あなたの名前をすべて覚えておく必要がありますスプライト。 alterantiveは、SKSpriteNodeのサブクラスとしてFireButtonクラスを作成FireButtonのインスタンスとしてfireButtonを宣言し、代わりに名前をチェックすることです、あなたは

if node is FireButton { 
    shoot() 
} 

は、この情報がお役に立てば幸い行うことができます!

+0

[OK]を、配列を反復処理する最適な方法は何ですか? – Shock9616

+0

これでエラーは解決しましたが、スレッド1のEXC_BAD_INSTRUCTION(コード= EXC_1386_INVOP、サブコード= 0x0)というfireButtonスプライトの初期化でエラーが発生しました。私はこのエラーについての質問を既にしていると思うので、これを自分自身で理解しようとします。あなたが自由に感じるのを助けたいのであれば、私はしばらく応答しないでしょう。助けてくれてありがとう! – Shock9616

+0

ようこそ。 2番目のエラーは、存在しないオブジェクト(まだ初期化されていないか、またはすでに割り当てが解除されているオブジェクト)にアクセスしていたことを意味します。私はあなたがオプションを使用してunwrapするときに問題があると思う! 。強制的にオブジェクトを展開する前に、オブジェクトがnilでないかどうかを調べてみてください。 – JohnV

関連する問題