【问题标题】:SpriteKit detect end of ContactSpriteKit 检测联系人结束
【发布时间】:2014-01-17 23:53:22
【问题描述】:

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

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

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

【问题讨论】:

    标签: objective-c sprite-kit skphysicsbody


    【解决方案1】:

    您需要正确实现联系委托并在正文上设置位掩码,以便触发联系通知。为此,请将其放在您的导入下方:

    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;
    


    在联系方式中,你无法控制哪个body是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 的“处理冲突和接触”部分。

    【讨论】:

    • 非常感谢。但它并没有更好地工作。接触检测仍然不可靠。场景通常不会检测到车轮何时接触地面。
    • 检查您的物理实体是否与您的精灵完全匹配。你是如何创建它们的?
    • 并且也许将 body 的 usesPreciseCollisionDetection 属性设置为 YES。无论哪种方式,代码都可以完美地运行在我身上。设置日志/断点以查找丢失的链接。
    • Banjaluchanine :) 静止辐射? ;) 我有同样的问题,发现 didBeginContact 和 didEndContact 事件完全不可靠。也许,只是也许,他们应该使用基于矩形的物理体,而不是任何其他类型的物理体。问题不在于委托的设置,我设置了所有内容,有时事件确实触发了! - 但并非始终如一,也并非一直如此。如果您没有将协议连接到委托并将联系人处理委托给委托,那么您将一无所获。所以这不是问题。
    猜你喜欢
    • 1970-01-01
    • 2015-05-30
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多