如何检测精灵节点上特定位置的 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 之间的冲突?的主要内容,如果未能解决你的问题,请参考以下文章