我想使用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");
}
我做错了什么?任何想法?
感谢。
答案 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;
}