在没有等待didBeginContact的情况下检查物理实体是否正在触摸另一个

时间:2015-02-18 09:18:17

标签: objective-c sprite-kit skphysicsbody

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

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

有这个功能:

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

但在下次更新创建节点之前,它似乎没有任何有用的东西。

1 个答案:

答案 0 :(得分:2)

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

由于你说圆圈的半径每次都不同,你必须跟踪它。一种方法是使用节点的用户数据。

[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;
}

如果要添加的圆的边界内有圆,则函数返回YES。这意味着您无法在不触及其他节点的情况下添加新节点。否则返回NO。这意味着您可以在不触及任何其他节点的情况下添加新节点。