SpriteKit检测联系结束

时间:2014-01-17 14:47:23

标签: objective-c sprite-kit skphysicsbody

我正试图弄清楚如何检测两个身体之间的接触何时结束。我正在做类似高山履带车的汽车游戏,只有当后轮接触地面时,汽车才能加速。

这是我现在的代码,但它无法正常运行:

- (void) didBeginContact:(SKPhysicsContact *)contact
{
    if (([contact.bodyB.node.name isEqualToString:@"rearWheel"] &&
         [contact.bodyA.node.name isEqualToString:@"ground"])) {
        isWheelOnGround = YES;
    }
}

-(void) didEndContact:(SKPhysicsContact *)contact {

        if (([contact.bodyB.node.name isEqualToString:@"rearWheel"] &&
             [contact.bodyA.node.name isEqualToString:@"ground"])) {
            isWheelOnGround = NO;
        }
    }

1 个答案:

答案 0 :(得分:2)

您需要正确实现联系人委托,并在主体上设置位掩码以启动联系人通知。要做到这一点,请将其放在导入下面:

typedef NS_OPTIONS(uint32_t, CNPhysicsCategory) {
    CNPhysicsCategoryWheel   = 1 << 0, // 0001 = 1
    CNPhysicsCategoryGround  = 1 << 1, // 0010 = 2
};

@interface YourSceneNameHere() <SKPhysicsContactDelegate>
@end


然后,在初始化时,将场景添加为联系人委托:

self.physicsWorld.contactDelegate = self;


现在,将这些面具应用于您的身体 - 他们所在的类别,以及他们将发送的联系通知的类别:

wheel.physicsBody.categoryBitMask = CNPhysicsCategoryWheel;
wheel.physicsBody.contactTestBitMask = CNPhysicsCategoryGround;

ground.physicsBody.categoryBitMask = CNPhysicsCategoryGround;
ground.physicsBody.contactTestBitMask = CNPhysicsCategoryWheel;


在联系方法中,您无法控制哪个正文是bodyA,哪个bodyB:

- (void) didBeginContact:(SKPhysicsContact *)contact {
    uint32_t contactTest = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask);
    if (contactTest == (CNPhysicsCategoryWheel | CNPhysicsCategoryGround)) {
        isWheelOnGround = YES;
    }   
}

同样适用于didEndContact。祝你好运!

有关此问题的另一个示例和详尽说明,请参阅“使用碰撞和联系人”。 the SK Programming Guide的一部分。