0

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

这是我现在的代码,但它不能正常工作:

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

1 回答 1

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;


在contact方法中,你无法控制哪个body是bodyA,哪个bodyB:

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

同样对于didEndContact。祝你好运!

有关这方面的另一个示例和详细说明,请参阅SK 编程指南的“处理碰撞和接触”部分。

于 2014-01-17T15:28:17.167 回答