2016-12-01 2 views
4

は、それらのノードにタッチに応答することは、多くの場合、このようないくつかの方法で行われます。touchesBegan、最初や最後だけでなく、すべてのタッチを取得する方法? SpriteKitベースのSKSpriteNodesおよび他の可視ノードで

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

     if let touch = touches.first {... 
// do something with the touch location that's now in touch 
// etc 

これは、すべての素晴らしいですが、私は確認する場合、私はタッチの情報を何を得ますこの中のすべてのタッチの(想像してみましょう...)SKSpriteNode?

= touches.firstは、このSKSpriteNode内の最初のタッチにのみ応答するよう条件を限定します。このSKSpriteNodeのすべての接触に対して、どのようにその場所が利用可能であるか、それが何であれ、持ち歩いて持ち歩くようになっている。

私は知っています。ばかげた質問。私はその男だ。私はこれがどのように行われているのか分かりません。

+0

:)ことを行う方法を示す数多くの良い答えがある - 便利になるところです。 'touches.first'は最初のタッチを返しますので、「何が触れていますか?」と尋ねる必要があります。メソッドシグネチャを見ると、 'touches'が 'Set 'であることがわかります。また、「touch」をalt-クリックすると、Xcodeでツールヒントが表示されます。今質問は 'Setのすべてのメンバーにアクセスする方法'ですので、Swiftのマニュアルとコレクションリファレンスの 'Set'情報を参照してください。これらの種類の質問を練習してください:-) –

+0

行方不明:「これを行うための最善の方法」、「最も効率的な方法」、「これを行う最も柔軟な方法は何ですか?他の主観的な質問は私が敢えて尋ねるのではなく、答えを求めています。私はそれが 'Set'であることを知っています、' Set 'から、' forループを通してセットの内容にアクセスする方法を知っています...しかし、確かに、これはタッチを扱うほど重要なことを行うための最良の/正しい/柔軟な方法ではありません...そうですか? ! @SteveIves。そして、 'multipleTouchEnabled'の必要性があります。これは、試行錯誤だけで学ぶことができます。そして、同じ質問をしている人々、それに従う人々がいます。 – Confused

+0

しかし、ほとんどの場合、SpriteKit(Appleがそれを気にしていて、多くのユーザーがいた場合)の使用に固有のものでなければならないあらゆる方法のドキュメントは、せいぜい節約しています... – Confused

答えて

8

multipleTouchEnabledプロパティがtrueに設定されていない限り、通常、ビューは複数のタッチに反応しません。

mySprite.multipleTouchEnabled = true 

あなたは方法は、単一のUITouchオブジェクトを返しますが、UITouchオブジェクトのセット(別称、順不同コレクション)しないtouchesBegan:event:ことに気づくでしょう。

このメソッドの内部では、最初のタッチをセットから取り除くのではなく、すべてのタッチで条件をチェックするためにセットを反復することができます。さらにCommscheckの答えで

for touch in touches { 
    // do something with the touch object 
    print(touch.location(mySKNodeObject)) 
} 
+0

これは答えです – Fluidity

+0

これは本当にそれの範囲ですか? @フルード何も良い、より厳しい?それ以上のものはありませんか? – Confused

+0

詳細情報なし。無限の例があります。あなたがセットの仕組みを理解していれば、あなたは一連のタッチを使う方法を知っているでしょう。これらのすべてのタッチで何をしようとしていますか?それらがセットであるので、反復なしでそれらを得る方法はありません。 – Fluidity

2

、これは、ノードが特定の場所にあるかどうかをチェックする方法です。SKScene.nodesを使用して

for _touch in touches { 
    let aTouch = _touch.location(in: self) 
    if nodes(at: aTouch).contains(desiredNode) { 
    print("desired node found") 
    desireNode.doSomething() 

    // You can also do, 
    // if desiredNode.contains(aTouch) { 
    } 
} 

、その後nodes以来.containsを使用して配列です。 SKSceneはSKNodeから継承SKEffectsNodeから継承..コマンド上部にSKSceneをクリックするか、ナビゲータのクラス階層構造に表示され、あなたがこのnodesすべての方法ダウンし、その起源をたどることができ...

open func nodes(at p: CGPoint) -> [SKNode]

「SKScene」と入力してから「。」を入力できます。すべてのメンバーのリストとそれらを実装するための適切な方法を見ることができます。

また、特定のノードで操作を行う必要がある場合は、SKNodeをサブクラス化して独自のカスタムノードを作成し、touches_メソッドをオーバーライドできます。

は、ここで私たちは、ドキュメントを読んで、コードのすべての行を理解することの実践について話しました

+0

これはちょうど私のメニューボタンの状態を解決するために非常に役立ちました。 – Confused

+0

heheh @Confused私はあなたが最終的に私の答えをupvotingに周りを参照してください参照してください:Pおそらく今あなたのような恩恵を与えることができます。タイ – Fluidity

関連する問題