1

我正在尝试实现检测两个精灵之间的碰撞的功能,但仅在这些精灵的特定位置。例如,如果我有一个钩子和一条鱼,而游戏的目的是用钩子钓到一条鱼,那么只有钩子的尖端与鱼钩的嘴或前部(比如 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];
     }
 }
4

2 回答 2

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

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

于 2013-11-08T06:25:11.187 回答
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]);
}
于 2014-01-31T20:30:19.350 回答