【问题标题】:Check if a physicsbody is touching another without waiting for didBeginContact检查一个物理体是否在不等待 didBeginContact 的情况下接触另一个物理体
【发布时间】:2015-02-18 09:18:16
【问题描述】:

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

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

有这个功能:

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

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

【问题讨论】:

  • 你添加的body是什么形状的?
  • 这是一个有范围的圆圈:SKPhysicsBody bodyWithCircleOfRadius:

标签: objective-c sprite-kit skphysicsbody


【解决方案1】:

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

既然你说圆的半径每次都会不同,所以你必须跟踪它。一种方法是使用节点的用户数据。

[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。这意味着您可以添加新节点而无需触及任何其他节点。

【讨论】:

  • 在这种情况下,这个函数应该是递归的(因为节点可以有子节点)。
  • 您没有在问题中讨论嵌套子节点。我认为重点是避免将节点放在其他节点之上
  • 你可以让它递归。它很简单。
  • 正确,这只是事后的想法,以防其他人偶然发现此代码:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-21
  • 1970-01-01
相关资源
最近更新 更多