2

次のコードがあります。

私のシーンで:

static const uint32_t enermyCategory    =  0x1 << 0;
static const uint32_t fatherCategory    =  0x1 << 1;

self.physicsWorld.contactDelegate = self;

    //init ship
Ship *ship = [Ship getFather];
ship.position = CGPointMake(CGRectGetMaxX(self.frame) - ship.frame.size.width , ship.frame.size.height);
[self addChild: ship];

    //init enermy
    Enermy *ene = [[Enermy alloc] initWithImageNamed:enermyName gameScene:self];
ene.position = ship.position;
[self addChild:ene];

#pragma mark - Physics Delegate Methods
- (void)didBeginContact:(SKPhysicsContact *)contact{
    NSLog(@"contact detected");
}

ご覧のとおり、最初から船とエネルギーの両方を同じ場所に設定しているため、常に衝突します。

両方のクラスについて、init メソッドに次のコードがあります。

//setup physics body
self.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.size];
self.physicsBody.dynamic = NO;
self.physicsBody.categoryBitMask = enermyCategory; #shipCategory for ship
self.physicsBody.collisionBitMask = 0;
self.physicsBody.contactTestBitMask = shipCategory; #enermyCategory for ship

私が見つけたのは、NSLogが呼び出されないため、物理的な衝突検出が機能しないことです.Apple開発者のチュートリアルからたくさん読んだことがあります. 画面上の船とエネルギーの画像が衝突しているのが見えます

4

2 に答える 2

4

physicalsBody を dynamic = NO に設定しても、接触には影響しません。可能性が高いのは、両方のノードに同じ contactBitMask と categoryBitMask を設定している場合です。船を次のように設定する必要があります。

self.physicsBody.categoryBitMask = shipCategory;
self.physicsBody.collisionBitMask = 0;
self.physicsBody.contactTestBitMask = enermyCategory;

敵には次のものが必要です。

self.physicsBody.categoryBitMask = enermyCategory;
self.physicsBody.collisionBitMask = 0;
self.physicsBody.contactTestBitMask = shipCategory;

結論: 船内で交換する必要があります。

于 2014-01-20T05:50:48.220 に答える
4
self.physicsBody.dynamic = NO;

静的 (非動的) ボディは接触イベントを生成しません。それらを動的にします。

また、gameScene を Enemy のインスタンスに渡しているようです。Enemy がゲーム シーン (ivar) を強く参照している場合、ここで保持サイクルを作成している可能性があります (敵はシーンを保持し、シーンは敵を保持します)。

スプライト キットでは、単純self.sceneにシーンにアクセスするために使用できます。初期化中にシーンが必要な場合は、そのコードをセットアップ メソッドに移動し、[ene setup]子として追加した直後に呼び出して、シーンに関連するセットアップ手順を実行します。

于 2014-01-17T20:40:02.143 に答える