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