Objective c 检查一个身体是否在不等待didBeginContact的情况下接触到另一个身体

Objective c 检查一个身体是否在不等待didBeginContact的情况下接触到另一个身体,objective-c,sprite-kit,skphysicsbody,Objective C,Sprite Kit,Skphysicsbody,我知道您可以使用skphysiccontactdelegate检测接触碰撞,但是您是否可以检查一个physicsbody当前是否接触另一个physicsbody 我需要这个来检查场景中的哪个区域仍然可以放置项目(例如,选择一个随机点,如果有什么阻碍,选择另一个随机点) 有这样一个功能: /* Returns an array of all SKPhysicsBodies currently in contact with this one */ - (NSArray *)allContacted

我知道您可以使用
skphysiccontactdelegate
检测接触碰撞,但是您是否可以检查一个physicsbody当前是否接触另一个physicsbody

我需要这个来检查场景中的哪个区域仍然可以放置项目(例如,选择一个随机点,如果有什么阻碍,选择另一个随机点)

有这样一个功能:

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

但在下一次更新创建节点之前,它似乎不会返回任何有用的内容。

您可以编写一个函数,手动迭代所有节点,并检查两个圆是否相交于一个点

[node.userData setObject:[NSNumber numberWithFloat:10.0] forKey:@"radius"];
既然你说圆的半径每次都不一样,你就得跟踪它。一种方法是使用节点的用户数据

[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;
}
-(BOOL)checkPointForNode:(CGPoint)pointwithradius:(CGFloat)nodeRadius
{
for(SKNode*子节点在[自子节点]中)
{
NSNumber*childRadius=child.userData[@“radius”];
if(childRadius!=nil)
{
CGFloat diffX=点.x-子位置.x;
CGFloat diffY=点.y-子位置.y;
CGFloat距离=sqrtf(diffX*diffX+diffY*diffY);
CGFloat SUMDARIUS=nodeRadius+childRadius.floatValue;

如果(距离)添加的实体的形状是什么?它是一个范围为:
SKPhysicsBody bodyWithCircleOfRadius:
的圆。在这种情况下,此函数应该是递归的(因为节点可以有子节点)。您在问题中没有提到嵌套的子节点。我认为重点是避免将节点放在其他节点之上。您可以使其递归。这非常简单。正确,这只是为了防止其他人偶然发现此代码而事后考虑:)