2015-01-07 2 views
5

私が作業しているアプリケーションでは、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; 
     } 
    } 
} 

関連コードを追加しました。それは私のコードなので、他にも変数がありますが、あなたはそれを理解することができます。

答えて

3

最も簡単な方法は、子スプライトを四角形の上、左、右、下に追加することです。それらに物理学の本文を追加すると、物事が衝突している場所を知ることができます。私はあなたが画面上に多くの多くの正方形を持っていない限り、この方法をまず試してみることをお勧めします。

画面に四角形があり、パフォーマンスが気になる場合は、 contact.contactPointを使用して、その点を正方形の座標に変換してください。正方形の中心点、正方形の回転角度とその点が与えられると、正方形が衝突した場所を知ることができます。それはいくつかの数学を必要とするでしょう。最初のものがあなたが本当に必要とするものであれば、そのような解決策を書くことを恐れていました。

私はあなたの連絡先(上、左、下、右)に関与しているものの側を決定するための最良の方法はにいると思い
+0

最初の方法は本当にうまくいきますが、なぜ私はそれについて考えなかったのか分かりません。ありがとうございました! – CMilby

+1

それがあなたを助けた場合、それを正解としてマークしてもよろしいですか? – hamobi

4

  • アップのための中心に十字で広葉樹ポイントを計算(あなたが乗スプライトを持っている場合など。)、ダウン、側面を左右

enter image description here

let halfWidth = self.frame.width/2 
let halfHeight = self.frame.height/2 
let down = CGPointMake(self.frame.origin.x+halfWidth,self.frame.origin.y) 
let up = CGPointMake(self.frame.origin.x+halfWidth,self.frame.origin.y+self.frame.size.height) 
let left = CGPointMake(self.frame.origin.x,self.frame.origin.y+halfHeight) 
let right = CGPointMake(self.frame.origin.x+self.frame.size.width,self.frame.origin.y+halfHeight) 
  • contactPointと各点側との間の距離を計算する(アップを、左、右および下

このステップは、この小さな機能を可能とすることができる:

func getDistance(p1:CGPoint,p2:CGPoint)->CGFloat { 
    let xDist = (p2.x - p1.x) 
    let yDist = (p2.y - p1.y) 
    return CGFloat(sqrt((xDist * xDist) + (yDist * yDist))) 
} 

その後、計算された最低距離に関連するポイントは、contactPointに最も近い側のポイントです。

は、この方法の利点は何ですか:

  1. あなたはゾンビやゴースト・ノードと相対的下剤体をペイントしていない
  2. ダイナミック可変CGPathに、だけでなく、内部にもこの方法で作業 知っている矩形の境界
  3. コード数行が短く、他のいくつかの行を追加すると、 でも対角線を特定し、より正確な0123を作ることができますアルゴリズム。
関連する問題