我正试图弄清楚如何检测两个身体之间的接触何时结束。我正在做类似高山履带车的汽车游戏,只有当后轮接触地面时,汽车才能加速。
这是我现在的代码,但它无法正常运行:
- (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;
}
}
答案 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的一部分。