【问题标题】:How to detect number of nodes involved in a collision in SpriteKit如何在 SpriteKit 中检测参与碰撞的节点数
【发布时间】:2014-02-07 09:44:27
【问题描述】:

我正在创建一个射击游戏,我从一个节点发射射弹,瞄准敌人的射弹。当射弹同时与两个敌方节点接触时,接触代理会被调用两次。我希望能够知道弹丸接触了多少个节点,以便为玩家提供 2 倍的奖励。

任何人都可以提出一种干净有效的方法来实现这一目标吗?

【问题讨论】:

  • 您可以随时将 hitCount 实例变量添加到您的弹丸中,并在每次接触时增加它。

标签: objective-c ios7 sprite-kit skphysicsworld


【解决方案1】:

如果您的奖励是针对 2 个同时联系的,请查​​看干净且听起来很性感的 -(NSArray *)allContactedBodies 实例方法,您可以在您的物理主体上调用它。它返回它当前接触的所有其他物理体的数组。请记住适当设置联系人位掩码。

【讨论】:

  • 尽管这是唯一的方法,但这种方法的问题是,当弹丸同时击中两个敌人时,联系人代表会被调用两次。如何确保第二次调用被忽略?
  • 不确定你的实现是什么,但你可以试试这个 - 当第一次调用联系人代表时,你将涉及的一个联系人位掩码(射弹的掩码)设置为 nil。这可以防止对它的任何后续调用。然后,您可以在适用时重新设置位掩码。
【解决方案2】:

也许您可以将 #hits 存储在一个属性和 kick of 方法中,用于检查初始命中 x 秒后的命中数?

换句话说:将命中检测与奖励逻辑分开。

【讨论】:

    【解决方案3】:

    所以,我在 cmets 部分接受了 Dobroćudni Tapir 的建议。

    添加了一个名为 hitCount 的变量作为子类射弹 SKSpriteNode 的属性。

    @property NSUInteger hitCount;
    

    然后在场景的didBeginContact中

    -(void)didBeginContact:(SKPhysicsContact *)contact
    {
        SKNode *firstBody;
        SKNode *secondBody;
    if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask)
        {
            firstBody = contact.bodyA.node;
            secondBody = contact.bodyB.node;
        }
        else
        {
            firstBody = contact.bodyB.node;
            secondBody = contact.bodyA.node;
        }
    
        if (firstBody.physicsBody.categoryBitMask == projectileCategory && secondBody.physicsBody.categoryBitMask == delusionCategory)
        {
            //Other logic
    
            RCCProjectile *projectile = (RCCProjectile*)firstBody;
            projectile.hitcount ++;
            [projectile removeFromParent];
        }
    }
    

    然后,最后在 projectileNode 中,我覆盖了 removeFromParent 方法

    -(void)removeFromParent
    {
        if (self.hitcount >= 2)
        {
            [(LevelScene*)self.scene showBonusForProjectile:self];
        }
    
        [super removeFromParent];
    }
    

    【讨论】:

      猜你喜欢
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多