私が作業しているアプリケーションでは、2つのキューブが衝突しています。私はこれを標準的な方法でチェックします。彼らは私の "didBeginContact"メソッドで衝突するとき、アプリは私に教えてくれます。SpriteKit - サイドAの正方形を決定する
-(void)didBeginContact:(SKPhysicsContact *)contact {
if (contact.bodyA.categoryBitMask == WALL_CATEGORY && contact.bodyB.categoryBitMask == CHARACTER_CATEGORY) {
CGPoint point = contact.contactPoint;
}
}
私は衝突が発生する場所を知っていますが、それは2つの四角形なので、コーナーを含む側面に沿ってどのポイントでもかまいません。では、左/右/上/下の衝突が排他的であるかどうかを確認するにはどうすればよいでしょうか?
編集:正解:それを行う最もクリーンな方法ではないかもしれませんが動作します。うまくいけばそれは将来誰かを助けるでしょう。
m_lNode = [SKNode node];
m_lNode.position = CGPointMake(-(CHARACTER_SIZE/2), 0);
m_lNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(1, m_character.size.height)];
m_lNode.physicsBody.allowsRotation = NO;
m_lNode.physicsBody.usesPreciseCollisionDetection = YES;
m_lNode.physicsBody.categoryBitMask = CHARACTER_L_CATEGORY;
m_rNode = [SKNode node];
m_rNode.position = CGPointMake((CHARACTER_SIZE/2), 0);
m_rNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(1, m_character.size.height)];
m_rNode.physicsBody.allowsRotation = NO;
m_rNode.physicsBody.usesPreciseCollisionDetection = YES;
m_rNode.physicsBody.categoryBitMask = CHARACTER_R_CATEGORY;
m_tNode = [SKNode node];
m_tNode.position = CGPointMake(0, (CHARACTER_SIZE/2));
m_tNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(m_character.size.width , 1)];
m_tNode.physicsBody.allowsRotation = NO;
m_tNode.physicsBody.usesPreciseCollisionDetection = YES;
m_tNode.physicsBody.categoryBitMask = CHARACTER_T_CATEGORY;
m_bNode = [SKNode node];
m_bNode.position = CGPointMake(0, -(CHARACTER_SIZE/2));
m_bNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(m_character.size.width, 1)];
m_bNode.physicsBody.allowsRotation = NO;
m_bNode.physicsBody.usesPreciseCollisionDetection = YES;
m_bNode.physicsBody.categoryBitMask = CHARACTER_B_CATEGORY;
[m_character addChild:m_tNode];
[m_character addChild:m_bNode];
[m_character addChild:m_lNode];
[m_character addChild:m_rNode];
-(void)didBeginContact:(SKPhysicsContact *)contact {
if (contact.bodyA.categoryBitMask == WALL_CATEGORY) {
switch (contact.bodyB.categoryBitMask) {
case CHARACTER_T_CATEGORY:
NSLog(@"Top");
m_isHitTop = true;
break;
case CHARACTER_B_CATEGORY:
NSLog(@"Bottom");
m_isHitBottom = true;
break;
case CHARACTER_L_CATEGORY:
NSLog(@"Left");
m_isHitLeft = true;
break;
case CHARACTER_R_CATEGORY:
NSLog(@"Right");
m_isHitRight = true;
break;
}
}
}
関連コードを追加しました。それは私のコードなので、他にも変数がありますが、あなたはそれを理解することができます。
最初の方法は本当にうまくいきますが、なぜ私はそれについて考えなかったのか分かりません。ありがとうございました! – CMilby
それがあなたを助けた場合、それを正解としてマークしてもよろしいですか? – hamobi