2017-03-01 5 views
0

プログラムにシーンにSKSpriteNode(name = building1)を追加し、touchesBegan関数を起動しません。だから私は(同じ=テクスチャを使用して)シーンエディタを介してスプライトノード(name = building2、parent = GameScene)を追加しようとしました。私は両方の建物を見ることができますが、第2の建物だけがtouchesBegan機能を起動します。プログラムでSpritekitNodeを追加してもtouchesBeganがトリガーされません。シーンエディタで追加された同じSpritekitノードが動作します。

class GameScene: SKScene {  
var build = SKSpriteNode() 

override func didMove(to view: SKView) { 

    build = SKSpriteNode(imageNamed: "build") 
    build.name = "building1" 
    build.anchorPoint = CGPoint(x: 0.5, y: 0.5) 
    build.position = CGPoint(x: 0, y: 0) 
    build.zPosition = 0 
    build.isUserInteractionEnabled = true 
    self.addChild(build) 

} 
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    print("Something was touched") 
    for touch in touches { 
     let location = touch.location(in: self) 

     if atPoint(location).name! == "building1" { 
      print("\(atPoint(location).name!) was touched") 
     } 
     if atPoint(location).name! == "building2" { 
      print("\(atPoint(location).name!) was touched") 
     } 
    } 

} 


} 

奇妙なことは、私はbuilding2(シーンエディタを通じて追加)をタッチすると、私はbuilding1もすなわち何も表示されない機能を起動しませんがbuilding2が「感動した出力」「何かが触れた」を得ることですログに記録する。 私は何が間違っていますか? おかげ

答えて

0

は、この行を削除し、それが動作するはずです:

build.isUserInteractionEnabled = true 

それは最初に奇妙に見えるかもしれません。要点は、ユーザーがノードと対話するようにすることです。なぜユーザー対話を無効にする必要がありますか?

まあ、これはドキュメントがisUserInteractionEnabledのために言うことである:

ノードがタッチイベントを受け取るかどうかを示し

ブール値。

trueに設定すると、シーンではなくノードがタッチイベントを受信します。したがって、シーンのtouchesBeganメソッドは呼び出されません。代わりに、ノードのtouchesBeganが呼び出されます。ただし、falseに設定すると、ノードはタッチイベントを受け取りません。タッチイベントはどこに行くのですか?ノードの親に(この場合、シーン)!

エディタから追加したノードには、デフォルトでisUserInteractionEnabled = falseがあります。

+0

はい、うまくいきました!そして、ここで私は自分のコードで全部終わっていると思った。ありがとう –

+0

私は何かを逃したかどうかを確認するために2番目のスプライトを追加しました。残念ながら、私はisUserInteractionEnabledプロパティがAttributes Inspectorに表示されないと思います。いずれにせよ、それは本当に微妙な点であり、説明する時間を取ってくれてありがとう。 –

関連する問題