Objective c SpriteKit检测触点末端

Objective c SpriteKit检测触点末端,objective-c,sprite-kit,skphysicsbody,Objective C,Sprite Kit,Skphysicsbody,我想知道如何检测两个物体之间的接触何时结束。我正在做一个汽车游戏,比如阿尔卑斯山履带,只有当后轮接触地面时,汽车才能加速 这是我目前的代码,但无法正常工作: - (void) didBeginContact:(SKPhysicsContact *)contact { if (([contact.bodyB.node.name isEqualToString:@"rearWheel"] && [contact.bodyA.node.name isEqual

我想知道如何检测两个物体之间的接触何时结束。我正在做一个汽车游戏,比如阿尔卑斯山履带,只有当后轮接触地面时,汽车才能加速

这是我目前的代码,但无法正常工作:

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

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

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

@interface YourSceneNameHere() <SKPhysicsContactDelegate>
@end

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

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
。祝你好运


有关这方面的另一个示例和详细说明,请参阅。

非常感谢。但效果并不好。接触检测仍然不可靠。当轮子触地时,场景通常无法检测到。检查你的物理身体是否与精灵完全匹配。您是如何创建它们的?也许可以将主体的usesPreciseCollisionDetection属性设置为YES。不管是哪种方式,代码在我这边都能完美地工作。设置日志/断点以查找丢失的链接。Banjaluchanine:)Sta se radi?;)我也有同样的问题,发现didBeginContact和didEndContact事件完全不可靠。也许,只是也许,它们的工作原理应该是基于矩形的物理体,而不是任何其他类型的物理体。问题不在于委托的设置,我设置了所有内容,有时事件确实会触发但并非始终如一,也并非始终如此。如果您没有将协议连接到委派,也没有将委派联系人处理连接到委派,那么您将什么也得不到。所以这不是问题。
- (void) didBeginContact:(SKPhysicsContact *)contact {
    uint32_t contactTest = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask);
    if (contactTest == (CNPhysicsCategoryWheel | CNPhysicsCategoryGround)) {
        isWheelOnGround = YES;
    }   
}