如何检测精灵节点上特定位置的 SKSpriteNode 之间的冲突?

Posted

技术标签:

【中文标题】如何检测精灵节点上特定位置的 SKSpriteNode 之间的冲突?【英文标题】:how to detect collisions between SKSpriteNodes in specific locations on the sprite nodes? 【发布时间】:2013-11-07 21:14:29 【问题描述】:

我正在尝试实现检测 2 个精灵之间的碰撞的功能,但仅限于这些精灵的特定位置。例如,如果我有一个钩子和一条鱼,而游戏的目的是用钩子钓到一条鱼,那么只有钩子的尖端与鱼钩的嘴或前部(比如 10%)之间的碰撞。鱼应该很重要,但不是任何其他碰撞。 有没有一种简单的内置方法来测试这个?如果没有,有没有关于如何做的指导?

我有以下标准代码来获取框架上的碰撞点,我将其添加到 CGPoint p = contact.contactPoint;

我从那里去哪里?

 - (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 ((firstBody.categoryBitMask & hookCategory) != 0 &&
         (secondBody.categoryBitMask & fishCategory) != 0)
     
         CGPoint p = contact.contactPoint;

         [self caught:(SKSpriteNode *) firstBody.node didCatchFish: (Fish *) secondBody.node];
     
 

【问题讨论】:

【参考方案1】:

contactPoint 表示场景坐标中的一个点。您想将其转换为您的节点 (Fish) 坐标:

Fish *fishNode = (Fish *) secondBody.node;
CGPoint p = [fishNode convertPoint:contact.contactPoint fromNode:self.scene];

然后你可以检查点的位置,如果它属于鱼的嘴或什么:

if (p.x < 10.0) 
    [self caught:(SKSpriteNode *) firstBody.node didCatchFish: fishNode];

我没有测试过代码,但我希望你明白了。

【讨论】:

谢谢你,安德烈,这很有帮助。您是否会为我提供有关在哪里寻找有关一般碰撞检测的指导的指示?出于某种原因,我注意到应用程序不会检测到碰撞,直到一个精灵位于第二个精灵的中心,而不是它们相交的第一个 x 坐标;我一直在寻找高低,但似乎找不到任何解释为什么会发生这种情况。 我只知道苹果官方文档:developer.apple.com/LIBRARY/ios/documentation/GraphicsAnimation/…【参考方案2】:

你在使用物理引擎吗?您可以添加鱼的子节点(可见或不可见)。设置适当的掩码:

mouth.physicsBody.categoryBitMask = MouthMask;
mouth.physicsBody.contactTestBitMask = HookMask;

SKPhysicsWorld委托方法didBeginContact:中可以测试“hook in mouth”的相关条件。

- (void)didBeginContact:(SKPhysicsContact *)contact 
  NSLog(@"%s\n  %@\n  %@", __PRETTY_FUNCTION__, [contact bodyA], [contact bodyB]);

【讨论】:

以上是关于如何检测精灵节点上特定位置的 SKSpriteNode 之间的冲突?的主要内容,如果未能解决你的问题,请参考以下文章

如何检测何时单击矩形对象、图像或精灵

Cocos2d 检测特定精灵的触摸

iOS Swift SpriteKit:如何使子精灵节点的位置和动作与其父精灵节点相同?

如何检测精灵套件中的碰撞?

如何获得具有动作CCRotate的精灵的位置?

nodeAtPoint 错误的节点