¿Impide que los nodos sprite se "apilen" uno encima del otro?

Estoy tratando de crear un escudo de encendido para mi juego iOS spritekit y en lugar de actualizar el escudo actual, astack otro escudo en la parte superior. Mi código:

     - (void) didMoveToView: (SKView *) view {
                ...
     self.shieldIsActive = NO;
                ...
 }
     - (void) didBeginContact: contact (SKPhysicsContact *) contact {
                ...
    else if (firstBody.categoryBitMask == CollisionCategoryLaser | firstBody.categoryBitMask == CollisionCategoryPlasmaShot | firstBody.categoryBitMask == CollisionCategoryProjectile && secondBody.categoryBitMask == CollisionCategoryShieldIcon) {
         // Proyectil o disparo de plasma o láser golpea icono de escudo
         ShieldIconNode * shieldIcon = (ShieldIconNode *) secondBody.node;
         ShieldNode * shield = [ShieldNode shieldAtPosition: CGPointMake (CGRectGetMidX (self.frame) +4, CGRectGetMidY (self.frame) -210)];
         [shieldIcon removeFromParent];
         if (firstBody.categoryBitMask == CollisionCategoryProjectile) {
             ProjectileNode * projectile = (ProjectileNode *) firstBody.node;
             [projectile removeFromParent];
         }
         if (! self.shieldIsActive) {
             [self addChild: escudo];
             self.shieldIsActive = SÍ;
         }
         // Retire el escudo después de un período de time.  ERROR: agrega múltiples escudos si uno ya está activo
         if (self.shieldIsActive) {
             SKAction * wait = [SKAction waitForDuration: ShieldTimer];
             [auto runAction: espera completar: ^ {[shield removeFromParent];}];
             self.shieldIsActive = NO; 

... }

Como señaló Domsware, el bitwise | necesita ser reemplazado por lógico || (y los paréntesis apropiados agregados) en su primera instrucción if . Curiosamente, ya que | el operador tiene una precedencia menor que el operador == , su statement if pudo haber funcionado como esperaba.

Además, debe considerar ocultar / mostrar un escudo en lugar de agregar / eliminar escudos como sugirió Whirlwind.

Dicho esto, algunos pensamientos …

  1. Las condiciones para if (!self.shieldIsActive) y if (self.shieldIsActive) siempre serán true (a less que shieldIsActive se configure en otro lugar en el código), lo que puede dar como resultado más de un escudo en la escena a la vez
  2. Mover self.shieldIsAction = NO al bloque de finalización de la acción resolverá este problema

y algún código …

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

Vamos a replace esta condición:

 else if (firstBody.categoryBitMask == CollisionCategoryLaser | firstBody.categoryBitMask == CollisionCategoryPlasmaShot |firstBody.categoryBitMask == CollisionCategoryProjectile && secondBody.categoryBitMask == CollisionCategoryShieldIcon){ 

por esto:

 else if ((firstBody.categoryBitMask == CollisionCategoryLaser || firstBody.categoryBitMask == CollisionCategoryPlasmaShot || firstBody.categoryBitMask == CollisionCategoryProjectile ) && secondBody.categoryBitMask == CollisionCategoryShieldIcon){ 

Observe el uso de || en lugar de | para el operador OR.