SpriteKit - 确定A方碰撞的A方

CMi*_*lby 5 collision-detection sprite ios

所以对于我正在研究的App,我有两个立方体碰撞.我以标准方式检查这个.该应用程序告诉我他们何时在我的"didBeginContact"方法中发生碰撞.

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

所以我知道碰撞发生在哪里,但因为它是两个正方形,它可以在包括角落在内的任何一点.那么我该如何检查左/右/上/下的碰撞?

编辑:正确答案:可能不是最干净的方法,但它的工作原理.希望它能帮助将来的某个人.

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

添加了一些相关代码.这是我的代码,所以除了其他东西之外还有变量,但你应该能够弄明白.

ham*_*obi 3

最简单的方法是在方块的顶部、左侧、右侧、底部添加子精灵。将物理体添加到其中,然后您就可以知道物体在哪里发生碰撞。我建议首先尝试此方法,除非屏幕上有很多方块。

如果屏幕上有大量方块并且您担心性能。然后可以使用contact.contactPoint该点并将其转换为方形坐标。给定正方形的中心点、正方形旋转的角度和该点,您应该能够判断正方形碰撞的位置。这需要一些数学知识......而且我害怕写出这种解决方案,因为第一个解决方案可能就是您真正需要的。