Sprite Kit碰撞多次碰撞

我已经看过,并已经find了单个碰撞的答案,但我正在寻找一种方法来检测多种types的碰撞。 我正在做一个有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]; } } 

这应该工作它已经被testing和工作

 //Define the collider Category typedef NS_ENUM(uint32_t, CollisionType) { enemyShipCategory = 0x1 << 0, enemyBulletCategory = 0x1 << 1, playerShipCategory = 0x1 << 2, bulletCategory = 0x1 << 3, }; // Set the category that this physics body belongs to // and specify which categories of bodies cause intersection // notifications with this physics body ship.physicsBody.categoryBitMask = playerShipCategory; ship.physicsBody.contactTestBitMask = enemyBulletCategory; shipBullet.physicsBody.categoryBitMask = bulletCategory; shipBullet.physicsBody.contactTestBitMask = enemyShipCategory | enemyBulletCategory; enemy.physicsBody.categoryBitMask = enemyShipCategory; enemy.physicsBody.contactTestBitMask = bulletCategory; enemyBullet.PhysicsBody.categoryBitMask = enemyBulletCategory; enemyBullet.physicsBody.contactTestBitMask = bulletCategory; // And handle Collisions - (void)didBeginContact:(SKPhysicsContact *)contact { uint32_t collision = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask); if (collision == (playerShipCategory | enemyBulletCategory)) { SKNode *Ship, *bullet; if (contact.bodyA.categoryBitMask == playerShipCategory) { Ship = contact.bodyA.node; bullet = contact.bodyB.node; } else { Ship = contact.bodyB.node; bullet = contact.bodyA.node; } [self takeDamageByAmount:POINT_INCREMENTER]; [bullet 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] ]]; [Ship runAction:bounce]; } else if (collision == (bulletCategory | enemyBulletCategory)) { [contact.bodyA.node removeFromParent]; [contact.bodyB.node removeFromParent]; } else if (collision == (bulletCategory | enemyShipCategory)) { SKNode *shipBullet, *enemyShip; if (contact.bodyA.categoryBitMask == shipBullet) { shipBullet = contact.bodyA.node; enemyShip = contact.bodyB.node; } else { shipBullet = contact.bodyB.node; enemyShip = contact.bodyA.node; } [self gainPointsByAmoint:POINT_INCREMENTER]; [self projectile:shipBullet didCollideWithMonster:enemyShip]; } } 

祝你好运!!