我如何正确使用allContactedBodies?

时间:2014-05-20 09:32:32

标签: sprite-kit skphysicsbody

我想使用allContactedBodies代替didBeginContact& didEndContact。

当我这样做时:

NSLog(@"%@", node.physicsBody.allContactedBodies );

与对象发生正确的联系,我得到类似的内容:

"<SKPhysicsBody> type:<Rectangle> representedObject:[<SKNode> name:'theBall' position:{149.55787658691406, 91.00054931640625} accumulatedFrame:{{70.462608337402344, -16.016334533691406}, {112.56977081298828, 127.18753814697266}}]"

现在我要做的就是说好的,如果你看到名字:'theBall'那么我们就连接了。 所以我尝试执行以下不起作用的代码。

if ([node.physicsBody.allContactedBodies containsObject:@"theBall"] ) {
            NSLog(@"Connected");
}

我做错了什么?任何想法?

感谢。

3 个答案:

答案 0 :(得分:2)

allContactedBodies属性返回一个SKPhysicsBody对象数组。您可以使用SKPhysicsBody的node属性访问每个physicsBody所连接的节点

NSArray *tempArray = [yourNode.physicsBody allContactedBodies];
for(SKPhysicsBody *body in tempArray)
{
    if([body.node.name isEqualToString:@"theBall"])
        NSLog(@"found the ball");
}

答案 1 :(得分:1)

如果您阅读了SKPhysicsBody类参考,您应该已经看过该命令的格式。

- (NSArray *)allContactedBodies

返回值为:

  

此正文与之接触的一组SKPhysicsBody对象。

话虽如此,您将使用此代码来完成您的要求:

NSArray *tempArray = [yourNode.physicsBody allContactedBodies];
for(SKNode *object in tempArray)
{
    if([object.name isEqualToString:@"theBall"])
        NSLog(@"found the ball");
}

仅供参考 - 您必须使用update:方法运行此代码。这意味着您的应用会花费宝贵的处理时间来检查联系人。坚持使用didBeginContact:会更有意义。

答案 2 :(得分:0)

显然,当碰撞发生得非常迅速时,会同时报告与多个节点的联系。在这种情况下,只会在didBeginContact中检测到其中一个冲突,您可能会丢失您感兴趣的联系人。

您可以检测didBeginContact中的同时(或几乎同时)联系人,并使用它来应用您需要的任何逻辑。

NSArray *tempArray = [mySprite.physicsBody allContactedBodies];
BOOL contactWithNodeOfInterest = NO;
int i = 0;
for(SKPhysicsBody *body in tempArray)
   {
    if([body.node.name isEqualToString:@"nodeOfInterest"]) { contactWithNodeOfInterest = YES; }
    NSLog(@"Contacts: %i %@",i,body.node.name);
    i = i + 1;
   }