0

2 つの物体間の接触がいつ終了したかを検出する方法を見つけようとしています。私はアルパイン クローラーのようなカー ゲームに取り組んでおり、後輪が地面に触れている場合にのみ、車は加速することができます。

これは今のところ私のコードですが、正しく動作しません:

- (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 メソッドでは、bodyA と bodyB を制御することはできません。

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

についても同様ですdidEndContact。幸運を!

この別の例と完全な説明については、SK Programming Guideの「Working with collisions and contacts」セクションを参照してください。

于 2014-01-17T15:28:17.167 に答える