2015-01-07 16 views
5

Vì vậy, đối với các ứng dụng tôi đang làm việc trên, tôi có hai khối va chạm. Tôi kiểm tra điều này theo cách tiêu chuẩn. Ứng dụng này cho tôi biết khi họ va chạm trong phương thức "didBeginContact" của tôi.SpriteKit - Xác định bên A Square va chạm với

-(void)didBeginContact:(SKPhysicsContact *)contact { 
    if (contact.bodyA.categoryBitMask == WALL_CATEGORY && contact.bodyB.categoryBitMask == CHARACTER_CATEGORY) { 
     CGPoint point = contact.contactPoint; 
    } 
} 

Vì vậy, tôi biết nơi xảy ra va chạm, nhưng vì nó là hai ô vuông, nó có thể ở bất kỳ điểm nào dọc theo cạnh bao gồm các góc. Vì vậy, làm thế nào tôi sẽ kiểm tra nếu va chạm ở bên trái/phải/trên/dưới độc quyền?

Chỉnh sửa: Câu trả lời đúng: Có thể không phải là cách sạch nhất để thực hiện nhưng nó hoạt động. Hy vọng nó sẽ giúp ai đó trong tương lai.

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; 
     } 
    } 
} 

Đã thêm một số mã có liên quan. Đó là mã của tôi vì vậy có các biến số trong số những thứ khác nhưng bạn sẽ có thể tìm ra nó.

Trả lời

3

cách dễ nhất là thêm hình ảnh con ở trên cùng, bên trái, bên phải, dưới cùng của ô vuông. Thêm các vật lý vật lý vào những vật thể đó, và sau đó bạn có thể biết mọi thứ đang va chạm ở đâu. Tôi khuyên bạn nên thử phương pháp này trước tiên trừ khi bạn có nhiều ô vuông trên màn hình.

Nếu bạn có hàng tấn ô vuông trên màn hình và bạn lo lắng về hiệu suất. sau đó có thể sử dụng contact.contactPoint và chuyển đổi điểm đó thành tọa độ vuông. cho điểm trung tâm của hình vuông, góc quay của hình vuông và điểm đó, bạn sẽ có thể biết vị trí của hình vuông va chạm. Điều đó sẽ đòi hỏi một số toán học .. và tôi sợ viết lên loại giải pháp đó khi người đầu tiên có thể là tất cả những gì bạn thực sự cần.

+0

Phương pháp đầu tiên của bạn hoạt động thực sự tốt, tôi không biết tại sao tôi không nghĩ về điều đó. Cảm ơn bạn! – CMilby

+1

bạn có nhớ đánh dấu nó là câu trả lời đúng nếu nó giúp bạn không? – hamobi

4

Tôi nghĩ rằng cách tốt nhất để xác định những gì bên tham gia vào liên lạc của bạn (trên cùng, bên trái, phía dưới, bên phải) là:

  • tính toán điểm lá bởi một cross trung cho lên , xuống, sang trái và phải bên (ví dụ nếu bạn có một ma phương ..)

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) 
  • Tính khoảng cách giữa các contactPoint và mỗi điểm bên (lên, trái, phải và xuống)

Bước này có thể có thể với chức năng này chút:

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))) 
} 

Sau đó, điểm liên quan với khoảng cách thấp nhất được tính toán là điểm bên gần điểm tiếp xúc nhất.

những ưu điểm của phương pháp này là gì:

  1. Bạn không sơn zombie hoặc nút ma và các cơ quan vật lý tương đối
  2. phương pháp làm việc này cũng bên trong một động mutable CGPath, không chỉ với ranh giới hình chữ nhật đã biết
  3. Nhanh, vài dòng mã và nếu bạn thêm vài dòng khác, bạn có thể là cũng có thể xác định đường chéo và chính xác hơncủa bạn Thuật toán.
Các vấn đề liên quan