如何确定多个物体重叠时的接触体,以及三者如何同时接触两者

我知道下面的DidBeginConact函数是如何工作的,但是当你有多个彩条(在示例代码中)时,如何检测哪些分类联系起来,或者当敌人与一个朋友重叠或者两个敌人重叠时,类别同时相交?

func didBeginContact(contact:SKPhysicsContact){

var firstBody: SKPhysicsBody var secondBody: SKPhysicsBody if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask { firstBody = contact.bodyA secondBody = contact.bodyB } else { firstBody = contact.bodyB secondBody = contact.bodyA } if firstBody.categoryBitMask == RedBallCategory && secondBody.categoryBitMask == GreenBarCategory { (secondBody.node!.removeFromParent()) score++ scoreLabel.text = "\(score)" } else if firstBody.categoryBitMask == GreenBallCategory && secondBody.categoryBitMask == RedBarCategory { (secondBody.node!.removeFromParent()) score++ scoreLabel.text = "\(score)" } 

我已经尝试了很多不同的组合,我不能让他们全部直接或记住我已经尝试过什么,我没有。

在此先感谢您的帮助和建议。

我不是这样的粉丝:

 if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask { firstBody = contact.bodyA secondBody = contact.bodyB } else { firstBody = contact.bodyB secondBody = contact.bodyA } 

并倾向于执行以下操作:

  let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask switch contactMask { // Redball and GreenBar have contacted case RedBallCategory | GreenBarCategory : score += 1 // ++ is deprecated scoreLabel.text = "\(score)" // Remove GreenBar let GreenBar = contact.bodyA.categoryBitMask == GreenBarCategory ? contact.bodyA.node! : contact.bodyB.node! GreenBar.removeFromParent // Greenball and RedBar have contacted case GreenBallCategory | RedBarCategory : score += 1 // ++ is deprecated scoreLabel.text = "\(score)" // Remove RedBar let RedBar = contact.bodyA.categoryBitMask == RedBarCategory ? contact.bodyA.node! : contact.bodyB.node! RedBar.removeFromParent default : //Some other contact has occurred } 

你可以添加RedBallCategory | GreenBarCategory RedBallCategory | GreenBarCategory情况下,您需要为您的游戏中的所有联系人采取行动。 单独编码每个潜在的联系人,如果…然后…其他人不会自己松动

这里是什么工作最好的基于史蒂夫的答案我的最新项目,请注意,虽然这是使用c + +和cocos2dx框架:

 PhysicsBody *a = contact.getShapeA()->getBody(); PhysicsBody *b = contact.getShapeB()->getBody(); int contactMask = a->getCategoryBitmask() | b->getCategoryBitmask(); switch (contactMask) { case PhysicsMasks::kInvaderCategory | PhysicsMasks::kShipFiredBulletCategory: { Invader* invader = dynamic_cast<Invader*>(a->getNode()) ? dynamic_cast<Invader*>(a->getNode()) : dynamic_cast<Invader*>(b->getNode()); Bullet* bullet = dynamic_cast<Bullet*>(a->getNode()) ? dynamic_cast<Bullet*>(a->getNode()) : dynamic_cast<Bullet*>(b->getNode()); if (bullet && invader) { invaderDied(invader, bullet); } } break; default: break; } 

PhysicsMask的声明如下:

 struct PhysicsMasks { static const int kInvaderCategory = 0x0001; static const int kShipFiredBulletCategory = 0x0002; }; const PhysicsMasks physicsMasks{};