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ó.
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
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