Ios 搜索具有最低y坐标的圆内节点(SKShapeNode)

Ios 搜索具有最低y坐标的圆内节点(SKShapeNode),ios,objective-c,sprite-kit,Ios,Objective C,Sprite Kit,我想搜索圆内的节点-圆是一个形状节点。返回节点(SKSpriteNode)应该是圆内具有最小y值的节点 对于感兴趣的人,以下是我用于搜索的代码: SKSpriteNode *currentNode = [SKSpriteNode spriteNodeWithColor:[UIColor clearColor] size:CGSizeMake(0, 0)]; [currentNode setPosition:CGPointMake(0, 99999)]; SKShapeNode *circle

我想搜索圆内的节点-圆是一个形状节点。返回节点(SKSpriteNode)应该是圆内具有最小y值的节点

对于感兴趣的人,以下是我用于搜索的代码:

SKSpriteNode *currentNode =  [SKSpriteNode spriteNodeWithColor:[UIColor clearColor] size:CGSizeMake(0, 0)];
[currentNode setPosition:CGPointMake(0, 99999)];

SKShapeNode *circle = [SKShapeNode shapeNodeWithCircleOfRadius:100];

// adding circle and other nodes to scene    

[self enumerateChildNodesWithName://* usingBlock:^(SKSpriteNode *foundNode, BOOL * _Nonnull stop) {
if ([circle containsPoint:currentNode.position]) {
    if (currentNode.position.y > foundNode.position.y) {
       currentNode = foundNode;
    }
}];

// currentNode = node inside circle with lowest y

我不喜欢这个解决方案,看起来只找到一个节点太费劲了。我还尝试使用nodesapoint/nodeapoint,但这在我的项目“大”子节点中不起作用


我很好奇:有没有一种更简单的方法来搜索具有这样细节的节点?

检查Y坐标比[circle containsPoint]快得多因此,您可能希望更改条件的顺序,以便首先比较候选节点的y坐标,并仅检查圆的最低点(-100)和当前节点的y坐标之间具有y坐标的节点的圆包含点

比如:

if ( foundNode.position.y > -100 
     && foundNode.position.y < currentNode.position.y )
{
  if ([circle containsPoint:foundNode.position])
  { currentNode = foundNode }
} 
if(foundNode.position.y>-100
&&foundNode.position.y

注意:我假设敌方.position实际上是指foundNode.position。

检查Y坐标要比[circle containsPoint]快得多因此,您可能希望更改条件的顺序,以便首先比较候选节点的y坐标,并仅检查圆的最低点(-100)和当前节点的y坐标之间具有y坐标的节点的圆包含点

比如:

if ( foundNode.position.y > -100 
     && foundNode.position.y < currentNode.position.y )
{
  if ([circle containsPoint:foundNode.position])
  { currentNode = foundNode }
} 
if(foundNode.position.y>-100
&&foundNode.position.y

注意:我假设敌人的位置实际上是被发现的节点位置。

恐怕不是。我认为这是检查节点的唯一方法。“我也尝试过使用nodesapoint/nodeapoint,但这在我的项目中不起作用”。我不明白,为什么它不起作用?你确定你不仅仅是使用不当吗?您应该能够从圆中的最低点向上移动,并继续调用nodeAtPoint,直到返回一个节点,这将是最低点。使用少量节点,速度将与当前方法相似。如果数量很大,速度会明显加快。这不起作用,因为如果节点有(大)子节点,我只想检测“主”节点。我再也找不到了,但我认为NodeStatPoint会自动搜索节点的子节点。如果这不是真的,请告诉我,但我认为是真的。还有:为什么那样会更快?如果圆很大(节点相对较小),那么圆中有很多点要检查。恐怕不行。我认为这是检查节点的唯一方法。“我也尝试过使用nodesapoint/nodeapoint,但这在我的项目中不起作用”。我不明白,为什么它不起作用?你确定你不仅仅是使用不当吗?您应该能够从圆中的最低点向上移动,并继续调用nodeAtPoint,直到返回一个节点,这将是最低点。使用少量节点,速度将与当前方法相似。如果数量很大,速度会明显加快。这不起作用,因为如果节点有(大)子节点,我只想检测“主”节点。我再也找不到了,但我认为NodeStatPoint会自动搜索节点的子节点。如果这不是真的,请告诉我,但我认为是真的。还有:为什么那样会更快?如果圆很大(节点相对较小),那么圆中有很多点需要检查。是的,这是一个很好的补充,谢谢。我还考虑使用带有节点的数组(仅应检查的节点)并搜索这些节点,而不是使用EnumerateChildNodeWithName://*搜索所有节点。我仍然在想,是否有一个更简单的方法来完成这一切。你有没有调查过SKPhysicContact?也许可以在您的上下文中使用它在我的上下文中确实有效,每次节点进入圆时填充数组,当节点结束与圆的接触时移除节点。谢谢你的主意!是的,这是一个很好的补充,谢谢。我还考虑使用带有节点的数组(仅应检查的节点)并搜索这些节点,而不是使用EnumerateChildNodeWithName://*搜索所有节点。我仍然在想,是否有一个更简单的方法来完成这一切。你有没有调查过SKPhysicContact?也许可以在您的上下文中使用它在我的上下文中确实有效,每次节点进入圆时填充数组,当节点结束与圆的接触时移除节点。谢谢你的主意!