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

时间:2013-11-07 21:14:30

标签: objective-c ios7 sprite-kit skspritenode

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

2 个答案:

答案 0 :(得分:3)

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

我没有测试过代码,但我希望你能有这个想法。

答案 1 :(得分:1)

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

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

SKPhysicsWorld委托方法didBeginContact:中,您可以测试“挂钩”的相关条件。

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