2

私は見て、単一の衝突に対する答えを見つけましたが、複数のタイプの衝突を検出する方法を探しています。私は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];
}
}
4

1 に答える 1

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

幸運を!!

于 2013-11-14T21:35:13.473 に答える