用于多次碰撞的Sprite Kit碰撞

时间:2013-10-20 03:26:37

标签: ios objective-c collision

我已经看了,并找到了单次碰撞的答案,但我正在寻找一种方法来检测多种类型的碰撞。我正在制作一个我想要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];
}
}

1 个答案:

答案 0 :(得分:6)

这应该可以使用它已经过测试和工作

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

祝你好运!!