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*) 的未定义引用