在不等待 didBeginContact 的情况下检查物理体是否正在接触另一个

Check if a physicsbody is touching another without waiting for didBeginContact

我知道你可以使用 SKPhysicsContactDelegate 来检测接触碰撞,但是你能检查一个物理体是否 当前 接触另一个物理体吗?

我需要这个来检查场景中的哪个区域仍然可以放置物品(例如,选择一个随机点,如果有东西挡住,选择另一个随机点)。

有这个功能:

/* Returns an array of all SKPhysicsBodies currently in contact with this one */
- (NSArray *)allContactedBodies;

但在下一次更新创建节点之前,它return似乎没有任何用处。

您可以编写一个函数来手动遍历所有节点并检查两个圆是否与一个点相交。

既然你说圆的半径每次都会不同,那你就得注意了。一种方法是使用节点的用户数据。

[node.userData setObject:[NSNumber numberWithFloat:10.0] forKey:@"radius"];

然后可以通过下面的方式判断是否有相交的圆

-(BOOL)checkPointForNode:(CGPoint)point withRadius:(CGFloat)nodeRadius
{
    for (SKNode* child in [self children])
    {
        NSNumber *childRadius = child.userData[@"radius"];
        if (childRadius != nil)
        {
            CGFloat diffX = point.x - child.position.x;
            CGFloat diffY = point.y - child.position.y;

            CGFloat distance = sqrtf(diffX * diffX + diffY * diffY);

            CGFloat sumRadius = nodeRadius + childRadius.floatValue;

            if (distance <= sumRadius)
            {
                return  YES;
            }

        }
    }
    return NO;
}

函数returns YES 如果在您要添加的圆的边界内有一个圆。这意味着您不能在不接触另一个节点的情况下添加新节点。否则它 returns NO。这意味着您可以在不接触任何其他节点的情况下添加新节点。