2016-12-27 8 views
0

私はSwiftのビットマスクの衝突をチェックする方法を学んでいて、両方のボディをお互いのコンタクトビットマスクにするかどうかを混乱させています。連絡先とカテゴリbitmask - 設定する必要があるのは1つだけか両方か?

私の混乱は、ドキュメントに次から来ている:

2物理学の体が重なって、接触が発生する可能性があります。 SceneKit は、体の接触マスクと他の身体のカテゴリマスクを比較するビット単位のAND演算を で実行します。結果が0以外の値の場合、 SceneKitは連絡先 を記述するSCNPhysicsContactオブジェクトを作成し、シーンの フィジックスワールドのcontactDelegateオブジェクトにメッセージを送信します。

私が理解していることから、衝突は相互にする必要はありません。言い換えれば、一方が他方と衝突する可能性があり、他方が動かないままです。私が間違っているなら、私を修正してください。しかしAは、そのカテゴリーのマスクが1に設定されていると接触が2に設定されており、Bはそのカテゴリーマスク2に設定しており、その接触が、その後ABは、レジスタを衝突させるだろう、4に設定するビットマスクビットマスク場合には、テストに連絡することを来るとき接触? Bのコンタクトビットマスクを1に設定したらどうなりますか? 2つの衝突が登録されますか?

答えて

1

実際のゲームコードの例を使ってこれらのビットマスクをすべて説明してみましょう。このゲームには、ボール、ピッチ、グラウンド、バット、境界、バッティングスタンプ、物理学の相互作用を持つボーリングスタンプがあります。

申し訳ありませんが、コードはObjCにありますが、Swiftへの翻訳は簡単です。

ステップ1:カテゴリのビットマスクを設定し、各オブジェクト


typedef NS_OPTIONS(NSUInteger, CollisionCategory) { 
    CollisionCategoryBall = 1 << 1, 
    CollisionCategoryPitch = 1 << 2, 
    CollisionCategoryGround = 1 << 3, 
    CollisionCategoryBat = 1 << 4, 
    CollisionCategoryBoundary = 1 << 5, 
    CollisionCategoryBattingStumps = 1 << 6, 
    CollisionCategoryBowlingStumps = 1 << 7, 
}; 

ステップ2のタイプを指定:今、私たちはお互いに衝突したオブジェクトかを決定します。


たとえば、ボールオブジェクトの場合、ピッチ、グラウンドバットおよび境界との衝突があります。

ballBody.collisionBitMask = 
     (CollisionCategoryPitch | CollisionCategoryGround | CollisionCategoryBat | 
     CollisionCategoryBoundary); 

ステップ3:(オプション)は、次の2つの物理体が互いに接触しているときに通知する場合は、次のようにこれはballBodySCNPhysicsBodyであると仮定すると、ビット単位のOR演算の設定です。


ここでは、contactTestBitMaskを設定します。例えばボールの場合、ピッチ、グラウンド、バット、バウンダリと接触しているときに通知を受けたい。ここでも、それを行うには:だから、全体的なあなただけの分類

- (void)physicsWorld:(SCNPhysicsWorld*)world 
    didBeginContact:(SCNPhysicsContact*)contact { 
    CollisionCategory contactMask = contact.nodeA.physicsBody.categoryBitMask | 
            contact.nodeB.physicsBody.categoryBitMask; 
    if ((contactMask == (CollisionCategoryBall | CollisionCategoryPitch)) && 
     !self.ballLandedOnPitch) { 
    NSLog(@" Ball hit the pitch"); 
    } 
    ... 
} 

:あなたはcontactTestBitMaskを設定すると

ballBody.contactTestBitMask = 
     (CollisionCategoryPitch | CollisionCategoryGround | CollisionCategoryBat | 
     CollisionCategoryBoundary); 

、あなたはこのようになります物理学のデリゲート、中に接触した通知を処理します衝突が発生するオブジェクトのカテゴリマスクのビット単位のOR演算である衝突マスクをセットアップし、オプションでボディ同士の接触を互いに処理し、接触テストビットマスクを設定します。

しかし、Aは、そのカテゴリーのマスク1に設定されているとの接触は、私はあなたが明示的に接触ビットマスクを設定する場合はわからない、2に

を設定するビットマスク場合には、テストに連絡しています上記の2まで。連絡先マスクは、実際に連絡先となるオブジェクトのカテゴリマスクのビット単位のOR演算である必要があり、通知する必要があります。

私はドキュメントがちょっと混乱していると思うし、上記の説明があなたの疑問を解決することを願っています。

+0

ありがとうございます!私は説明に本当に感謝し、私はこれが私の思考のいくつかをクリアすると信じています。私はいくつかの質問があります:カテゴリのマスクは1つのビットシフトとして設定する必要がありますか?言い換えれば、1つ以上の/すべてのビットを1に設定してカテゴリを構成できますか?また、1111111のカテゴリビットマスクと同様です。また、衝突には2つのオブジェクトが関係するため、連絡先マスクとして他のセットを通知する必要があるのは1つだけですか?または、コンタクトマスクをお互いに設定する必要がありますか?私はそれがどちらかであることを読んだが、私はあまりよく分からない。 – rb612

+0

'1111111のカテゴリのビットマスクに似ていますか? '可能です(https://developer.apple.com/reference/scenekit/scnphysicsbody/1514768-categorybitmask)。 「お互いにコンタクトマスクをセットする必要がありますか?」と設定するだけで十分でしょう。 –

+0

ああ、カテゴリの面では、8つしかないが、オブジェクトは複数のカテゴリに属している可能性があります、そうですか? – rb612

関連する問題