2015-08-15 68 views
0

我正在为我的游戏创建一个屏蔽电源。它的工作方式是如果你拍摄一个通电图标,你会获得一个随着时间的推移而失效的盾牌。当一块岩石撞击盾牌时,它会被破坏而产生碎片。发生的问题是,在游戏过程中,当你点击多个盾牌图标时,创建的碎片数量会显着增加。就好像有多个盾牌,只有一个。我该如何解决?- [SKScene didBeginContact]执行多次

My Code: 
- (void) didBeginContact:(SKPhysicsContact *)contact{ 
     ... 
    else if (firstBody.categoryBitMask == CollisionCategoryRocks && secondBody.categoryBitMask == CollisionCategoryShield){ 
     // Rock hits Shield 
     if (!_shield.hidden){ 
      if (firstBody.categoryBitMask == CollisionCategoryRocks){ 
       SpaceRockNode *spaceRock = (SpaceRockNode *) firstBody.node; 
       [spaceRock removeFromParent]; 
       [self createDebrisAtPosition:contact.contactPoint]; 
      } 
     } 
    } 

    else if ((firstBody.categoryBitMask == CollisionCategoryLaser || firstBody.categoryBitMask == CollisionCategoryPlasmaShot ||firstBody.categoryBitMask == CollisionCategoryProjectile) && secondBody.categoryBitMask == CollisionCategoryShieldIcon){ 
    // Projectile hits Shield Icon 

     if (!self.shieldIsActive){ 
      self.shield = [ShieldNode shieldAtPosition:CGPointMake(CGRectGetMidX(self.frame)+4, CGRectGetMidY(self.frame)-210)]; 
      [self addChild:self.shield]; 
      self.shieldIsActive = YES; 
      SKAction *wait = [SKAction waitForDuration:ShieldTimer]; 
      [self runAction:wait completion:^{ 
       self.shield.hidden = YES; 
       self.shieldIsActive = NO; 
      }]; 
     } 
    } 
      ... 
} 

回答

2

你的问题是,2次碰撞正在发生时,碎片飞出像疯了似的:

  1. 太空岩石X和盾1
  2. 太空岩石X和盾2

这导致didBeginContact:被称为两次等等,你有两倍的碎片飞出去。

有一件事我会解决,只是为了缩短你的代码一点,就是要改变这种说法......

SpaceRockNode *spaceRock = (SpaceRockNode *) firstBody.node; 
[spaceRock removeFromParent]; 

成...

[firstBody.node removeFromParent]; 

如果你不这样做做任何其他与Space Rock,然后没有任何理由使节点成为一个空间摇滚只是为了使用它作为节点。


接下来,把这个if声明...

if (!self.shieldIsActive) { 
    ... 
} 

成...

if (!self.shieldIsActive && ![self.children containsObject:self.shield]) { 
    ... 
} 

此修改语句用来确保self.shieldself.children成员加入self.shield之前self.children第二次。如果只有一个盾牌,只有一束碎片会飞出。

如果self.shield设置为nil(换句话说,它没有被分配到尚),该containsObject:方法将评估为NO因为self.children不包含nil如果您尝试添加nil节点,则Xcode实际上会因异常而中断。因此,如果self.shieldnil,则该表达式将始终评估为NO

+0

当我进入![self.children containsObject:self.shield]部分时,在第一次屏蔽启动后不再获得屏蔽。只有这样做才有效。 – Exprosul

+0

@Exprosul是的。 **这就是要点。**如果你有多个盾牌,那么它不应该在第一个盾牌之上制造第二个盾牌。 – DDPWNAGE