intersectsNode 未检测到交叉点

Posted

技术标签:

【中文标题】intersectsNode 未检测到交叉点【英文标题】:intersectsNode not detecting intersection 【发布时间】:2013-12-19 03:20:08 【问题描述】:

我正在使用 spriteKit (objective-C) 构建一个应用程序,并且我正在使用 intersectsNode 来判断玩家绘制的线条是否与游戏板上的字母图块发生碰撞。我的程序中有另一个 intersectsNode 实例运行良好,但由于某种原因,这个新场景总是返回 false。我检查了参数,spriteKit 唯一说的是确保它们都是同一棵树的孩子,它们肯定是(自我)。一个是 SKSpriteNode,另一个是 SKShapeNode。

if (directionIsDecided == TRUE) 
    for (letterTile in letterTileArray) 
        if ([letterTile intersectsNode:selectorLine]) 
            [lettersToBeCalculatedForPoints addObject:letterTile];
        
    

希望我没有忽略一些愚蠢的事情......有什么想法可能导致这个函数永远不会返回 true 吗?

*编辑

好的,我认为这与我如何画线有关。我对其进行了更改,因此它可以检测到与板上产生的元音的碰撞,每个元音都是 letterTile 的孩子,现在它告诉我所有元音都与 selecorLine 发生碰撞,即使它没有触及任何他们。

这就是我创建 selectorLine 的方式:

实施:

    CGMutablePathRef pathToDraw;
    SKShapeNode *selectorLine;

TouchesBegan:

   UITouch* touch = [touches anyObject];
   CGPoint positionInScene = [touch locationInNode:self];

   pathToDraw = CGPathCreateMutable();
   CGPathMoveToPoint(pathToDraw, NULL, positionInScene.x, positionInScene.y);

   selectorLine = [SKShapeNode node];
   selectorLine.path = pathToDraw;
   selectorLine.strokeColor = [SKColor greenColor];
   selectorLine.lineWidth = 10;
   [self addChild:selectorLine];
   selectorLine.zPosition = 101;

TouchesMoved:

    UITouch* touch = [touches anyObject];
    CGPoint positionInScene = [touch locationInNode:self];
    CGPathAddLineToPoint(pathToDraw, NULL, positionInScene.x, positionInScene.y);
    selectorLine.path = pathToDraw;

感谢任何和所有想法,谢谢!

【问题讨论】:

通过调试我发现程序肯定在内存中找到了letterTiles,并且肯定在内存中找到了selectorLine。我已经将 selectorLine.lineWidth 增加到 200,使它变得如此令人讨厌,它覆盖了每一个 letterTile,与 zPosition 一起玩(显然什么也没做)。我真的不知道还能做些什么来调试这个问题......这不是我想做的一件非常复杂的事情......我只是不明白:( 当我使用 NSLog(@"%f, %f", selectorLine.frame.size.height, selectorLine.frame.size.width); ,它只是打印出线所在的坐标... NSLog(@"%f, %f", selectorLine.xScale, selectorLine.yScale);只是打印出 1.0 1.0.... 我只是试图将 SKShapeNode 与另一个节点进行比较? 【参考方案1】:

我一直在我的代码中解决这个问题,将CGRectIntersectsRect 用于SKShapeNode 边界矩形交叉点。

使用CGRectIntersectsRect,您的代码将如下所示:

if (directionIsDecided == TRUE) 
    for (letterTile in letterTileArray) 
        if (CGRectIntersectsRect(letterTile.frame, selectorLine.frame)) 
            [lettersToBeCalculatedForPoints addObject:letterTile];
        
    

【讨论】:

附加信息:如果您使用的一个或两个节点是简单的 SKNode,其内容为子节点,则将 .frames 替换为 calculateAccumulatedFrame()。 (因为 SKNode 在其框架中没有宽度或高度)。【参考方案2】:

intersectsNode 使用 calculateAccumulatedFrame 方法。

在 SpriteKit 文档深处的一些地方指出,在许多情况下,您应该用自己的方法覆盖此方法。读完之后,我最终一直这样做。 SKShapeNodes 就是一个很好的例子。但是,如果您将 SKNode 子类化并用其他内容填充它,您可能也不希望所有内容都像往常一样“相交”。

所以覆盖你的 shapenode 子类的 calculateAccumulatedFrame 方法,它应该再次很好地相交。

【讨论】:

有趣...我已经编写了解决问题的方法,但是很高兴知道这一点以供将来参考。我还有一些准备移植到 spriteKit 的东西,可以从中受益。感谢您的回复:) 我遇到了类似的问题,发现事实并非如此。根据文档字符串“如果两个节点的 frames 相交,则认为这两个节点相交。在此测试中忽略两个节点的子节点。”我在calculateAccumulatedFrame 中有一个断点,不幸的是,在使用intersectsNode 时它没有被调用。 同意@nrj - 请参阅我对类似问题的回答:在我的情况下,我必须通过帧比较直接调用 calculateAccumulatedFrame,建议 intersect 使用 .frame 进行比较,而不是 calculateAccumulatedFrame。【参考方案3】:

我和你有同样的问题。我有一个未声明的数组,因此向其中添加对象什么也没做,也没有要检查的节点。仔细检查您的 letterTileArray 是否为空。

【讨论】:

一切都在里面,并且它应该进行比较。我和一个制作 spriteKit 教程的人谈了一点,他说 skshapenode 的行为不规律,我怀疑这是导致我的错误的原因。我仍然不知道为什么它的行为不规则,或者它的行为方式如何,但我最终以完全不同的方式对其进行了编程,虽然不如我最初的概念那么好,但现在可以完成工作。如果我自己找不到答案,希望 SOMEMONE 很快会给我一些想法……【参考方案4】:

类似的问题,在我的例子中,我比较的一个节点是简单的 SKNode 将其他节点类型分组在一起。 SKNode 有一个位置,但没有宽度和高度,因此它不会“相交”任何东西。

对我来说,@JoePasq 和 @Theis Egeberg 的答案需要结合起来:

if node.calculateAccumulatedFrame().intersects(sprite.frame) ...

(请注意,如果两个节点都是简单的 SKNodes,那么在两个位置都使用 caluclateAccuulatedFrame,在我的例子中,精灵是一个 SKSpriteNode,所以一个简单的 .frame 就可以了。)

【讨论】:

以上是关于intersectsNode 未检测到交叉点的主要内容,如果未能解决你的问题,请参考以下文章

Spritekit SkNodes 交点的 Rect / Polygon

从 emxArray_uint8_T 检测到错误:.text+0xc1):未定义对 `emxInit_uint8_T1(emxArray_uint8_T**, int)' 的引用?

交叉编译:链接时对 std::__atomic_futex_unsigned_base::_M_futex_notify_all(unsigned int*) 的未定义引用

在 ARkit 中未检测到 SceneKit 碰撞

配置 IntelliJ IDEA,以便在 git 中检测到源但检测到未注册的 Vcs 根

Git与SVN交叉使用