2013-10-20 57 views
2

我已經看過,並且找到了單個碰撞的答案,但我正在尋找一種方法來檢測多種類型的碰撞。我正在製作一個有我想要的3次碰撞的遊戲。用戶飛機與敵方子彈相撞,用戶的子彈與敵機(我已經工作過)碰撞,敵方子彈和用戶子彈相撞。我有所有的categoryBitMask和contactTestBitMask設置和更正。這是我的委託方法。Sprite Kit碰撞多重碰撞

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

回答

5

這應該工作,它已經測試和工作

//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]; 
    } 
} 

GOOD LUCK !!