2015-10-16 10 views
6

SpriteKitを使用してiOSで開発するSwift2を学び始めています。スプライトの目に見える部分に触れたかどうかを検出できないようです。SpriteKitを使用してスプライトの境界ボックス(アルファマスク)内の接触を検出する

let touchedNode = self.nodeAtPoint(location) 

しかし、これはスプライトのタッチを検出:

私はこのように触れたノードを見つけることができます。スプライトの「透明でない」部分のタッチを検出したいと思います。

私が選択したノードのバウンディングボックスは、このようなタッチの場所が含まれている場合は、アルファマスクバウンディングボックスとテストとPhysicsBodyを作成してみました:

sprite.physicsBody = SKPhysicsBody.init(texture: sprite.texture!, size: sprite.size) 
sprite.physicsBody?.affectedByGravity = false 
if (touchedNode.containsPoint(location)){ 

しかし、それは助けにはなりませんでした。スプライトの透明部分をクリックすると、イベントが引き続きトリガーされます。

ドキュメントには「テクスチャ内のすべてのテクセルにゼロ以外のアルファ値が含まれている新しいフィジックスボディが作成されています」というメッセージがあります。

お時間をいただきありがとうございます。

PS:私のアルファ閾値ではもっと寛大な努力もしましたが、これも機能しませんでした(透明性が完全でない場合)。


UPDATE:

もう少し詳細を追加するには、私は、レベルエディタを構築しています。これは、ユーザーが選択したものに応じて多くのノードを作成することを意味し、これらのノードを選択/移動/回転/などできるようにする必要があります。実際にはPNG画像が自動的にxcassetteに追加されるので、SKSpriteNodesを使用しています。私はあなたがノードを選択すると、この値は、シーンエディタ(Xcodeの)に示されるように、PhysicsBodyのアルファマスクバウンディングボックスを使用することを決定し、選択すると、アルファマスクのハイライト私のことができるようにしたい私のスプライトの正確一部内部のタッチを検出する。

私が誤ったアイデアやテクニックを使用している場合は、教えてください。私はSwiftとSpriteKitを使い始めたので、これは可能です。


私は右のphysicsBodyを取得する(推奨されているように)physicsWordを照会し、このように接続されたノードの名前だ2

UPDATE:

let body = self.physicsWorld.bodyAtPoint(location) 
print(body?.node?.name) 

をしかし、これはまだ印刷されます私が境界ボックスの外に触れてもノードの名前は、私には分かりません。

ご協力いただきありがとうございます。

+0

これを行うには良い方法がありますか? – Confused

答えて

2

SKPhysicsBodySKNodeの境界を定義していません。シーンのSKPhysicsWorldbodyAtPointを呼び出すことで、ヒットチェックを行うことができます。それはあなたが興味を持っているSKPhysicsBodyを返します。

+0

これは、部屋のゾウを避けているようです。私はそれを間違った方法でやっているのですか?境界ボックス(アルファマスク)からシーンのオブジェクトに触れるのを検出する良い慣行は何ですか?つまり、その解決法は明らかに、私が持っているより根本的な問題のハックです。そうではありませんか?とにかく忍耐してくれてありがとう。 –

+0

私の編集された答えはより良く、SKSpriteNodesのタッチを検出する "正しい"方法です。 –

+0

Hum、 "self.physicsWorld.bodyAtPoint(location)"を実行しようとしましたが、これは私のスプライトを正確に同じ方法で返します。境界ボックスが正しくても(私はオブジェクトを動かすことによってそれをテストすることができますが、タッチを検出しようとしているアルファのマスクされたバウンディングボックスを使って他のオブジェクトと正しく衝突します)。 –

関連する問題