実際のゲームコードの例を使ってこれらのビットマスクをすべて説明してみましょう。このゲームには、ボール、ピッチ、グラウンド、バット、境界、バッティングスタンプ、物理学の相互作用を持つボーリングスタンプがあります。
申し訳ありませんが、コードは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つの物理体が互いに接触しているときに通知する場合は、次のようにこれはballBody
はSCNPhysicsBody
であると仮定すると、ビット単位の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演算である必要があり、通知する必要があります。
私はドキュメントがちょっと混乱していると思うし、上記の説明があなたの疑問を解決することを願っています。
ありがとうございます!私は説明に本当に感謝し、私はこれが私の思考のいくつかをクリアすると信じています。私はいくつかの質問があります:カテゴリのマスクは1つのビットシフトとして設定する必要がありますか?言い換えれば、1つ以上の/すべてのビットを1に設定してカテゴリを構成できますか?また、1111111のカテゴリビットマスクと同様です。また、衝突には2つのオブジェクトが関係するため、連絡先マスクとして他のセットを通知する必要があるのは1つだけですか?または、コンタクトマスクをお互いに設定する必要がありますか?私はそれがどちらかであることを読んだが、私はあまりよく分からない。 – rb612
'1111111のカテゴリのビットマスクに似ていますか? '可能です(https://developer.apple.com/reference/scenekit/scnphysicsbody/1514768-categorybitmask)。 「お互いにコンタクトマスクをセットする必要がありますか?」と設定するだけで十分でしょう。 –
ああ、カテゴリの面では、8つしかないが、オブジェクトは複数のカテゴリに属している可能性があります、そうですか? – rb612