【问题标题】:Search for node inside circle (SKShapeNode) with lowest y-coordinate搜索具有最低 y 坐标的圆内节点 (SKShapeNode)
【发布时间】:2016-01-16 22:58:29
【问题描述】:

我想搜索一个圆圈内的节点 - 圆圈是一个 SKShapeNode。返回节点 (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

我不喜欢这个解决方案,看起来只找到一个节点需要花费太多精力。我也尝试使用 nodesAtPoint/nodeAtPoint 但这在我的项目中不起作用 - “大”子节点。

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

【问题讨论】:

  • 恐怕不行。我认为这是检查节点的唯一方法。
  • “我也尝试过使用nodeAtPoint/nodeAtPoint,但这在我的项目中不起作用”。我不明白,为什么它不起作用?你确定你不只是使用不当吗?您应该能够从圆圈中的最低点开始工作并继续调用 nodeAtPoint 直到您返回一个节点,这将是最低节点。使用少量节点,它的速度与您当前的方法相似。量大的话,速度会明显加快。
  • 它不起作用,因为节点有(大)子节点,我只想检测“主”节点。我再也找不到它了,但我认为 nodeatpoint 会自动搜索节点的子节点。如果这不是真的,请告诉我,但我认为它是。另外:为什么那样会更快?如果圆圈很大(并且节点相对较小),则您需要在圆圈中检查很多点。

标签: ios objective-c sprite-kit


【解决方案1】:

检查 Y 坐标将比 [circle containsPoint] 快得多,因此您可能需要更改条件的顺序以首先比较候选节点的 y 坐标,并且仅检查具有 y 坐标的节点的 circle containsPoint圆的最低点 (-100) 和 currentNode 的 Y 坐标。

类似:

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

注意:我假设enemy.position 实际上是为了找到Node.position。

【讨论】:

  • 是的,这是一个很好的补充,谢谢。我还在考虑使用带有节点的数组(仅应检查的节点)并搜索这些节点而不是使用 enumerateChildNodesWithName://* 的所有节点。不过,我仍然想知道,是否有更简单的方法来完成所有这些操作。
  • 您查看过 SKPhysicsContact 吗?也许它可以在你的上下文中使用
  • 它在我的上下文中确实有效,每次节点进入圆圈时填充数组,并在结束与圆圈接触时删除节点。感谢您的想法!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-31
  • 1970-01-01
  • 2014-02-02
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
  • 1970-01-01
相关资源
最近更新 更多