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



我正在尝试实现检测 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];
     }
 }

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];
}

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

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

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

SKPhysicsWorld委托方法didBeginContact:您可以测试"口钩"的相关条件。

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

最新更新