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:
的圆。在这种情况下,此函数应该是递归的(因为节点可以有子节点)。您在问题中没有提到嵌套的子节点。我认为重点是避免将节点放在其他节点之上。您可以使其递归。这非常简单。正确,这只是为了防止其他人偶然发现此代码而事后考虑:)