私は見て、単一の衝突に対する答えを見つけましたが、複数のタイプの衝突を検出する方法を探しています。私は3つの衝突があるゲームを作っています。ユーザーの弾丸が敵の弾丸と衝突し、ユーザーの弾丸が敵の飛行機(私はすでに作業しています)と衝突し、敵の弾丸とユーザーの弾丸が衝突します。私はすべての categoryBitMask と contactTestBitMask をセットアップして修正しました。これが私のデリゲートメソッドです。
- (void) didBeginContact:(SKPhysicsContact *)contact {
SKPhysicsBody *firstBody, *secondBody;
if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask)
{
firstBody = contact.bodyA;
secondBody = contact.bodyB;
}
else
{
firstBody = contact.bodyB;
secondBody = contact.bodyA;
}
// if user plane hits enemy bullet
if ((firstBody.categoryBitMask == playerShipCategory) &&
(secondBody.categoryBitMask == enemyBulletCategory)) {
[self takeDamageByAmount:POINT_INCREMENTER];
[_enemyBullet removeFromParent];
SKAction *bounce = [SKAction sequence:@[
[SKAction fadeAlphaTo:.5 duration:.2],
[SKAction fadeAlphaTo:1.0 duration:.2],
[SKAction fadeAlphaTo:.5 duration:.2],
[SKAction fadeAlphaTo:1.0 duration:.2]
]];
[_playerPlane runAction:bounce];
}
// if the user bullet hits the enemy bullet
else if ((firstBody.categoryBitMask == bulletCategory) &&
(secondBody.categoryBitMask == enemyBulletCategory)) {
[_enemyBullet removeFromParent];
[_bullet removeFromParent];
}
// if bullet hits enemy ship - THIS ONE WORKS, but none of the others work for some reason
else if ((firstBody.categoryBitMask == bulletCategory) &&
(secondBody.categoryBitMask == enemyShipCategory)) {
[self gainPointsByAmoint:POINT_INCREMENTER];
[self projectile:(SKSpriteNode *)firstBody.node didCollideWithMonster:(SKSpriteNode *)secondBody.node];
}
}