【问题标题】:Sprite Kit collisions for multiple collisions多重碰撞的 Sprite Kit 碰撞
【发布时间】:2013-10-28 17:02:38
【问题描述】:

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

【问题讨论】:

    标签: ios objective-c collision


    【解决方案1】:

    这应该可以工作,它已经过测试并且可以工作

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

    祝你好运!!

    【讨论】:

      猜你喜欢
      • 2014-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-16
      • 1970-01-01
      相关资源
      最近更新 更多