我正在使用spriteKit(objective-C)构建一个应用程序,我正在使用intersectsNode来判断玩家绘制的线条是否与游戏板上的字母图块发生碰撞。我的程序中有另一个intersectsNode实例正常工作,但由于某种原因,这个新方案总是返回false。我已经检查了参数,spriteKit说的唯一一件事就是确保它们都是同一棵树的孩子,他们肯定是(自己)。一个是SKSpriteNode,另一个是SKShapeNode。
if (directionIsDecided == TRUE) {
for (letterTile in letterTileArray) {
if ([letterTile intersectsNode:selectorLine]) {
[lettersToBeCalculatedForPoints addObject:letterTile];
}
}
}
希望我不会忽视一些愚蠢的事情......任何可能导致此功能永远不会返回真实的想法?
*修改
好吧,我认为这与我如何画线有关。我改变了它,因此它检测到与板上产生的元音碰撞,每个元音都是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;
感谢任何和所有想法,谢谢!
答案 0 :(得分:5)
我通过CGRectIntersectsRect
使用SKShapeNode
边界矩形交叉点,在我的代码中解决了这个问题。
使用CGRectIntersectsRect
您的代码如下:
if (directionIsDecided == TRUE) {
for (letterTile in letterTileArray) {
if (CGRectIntersectsRect(letterTile.frame, selectorLine.frame)) {
[lettersToBeCalculatedForPoints addObject:letterTile];
}
}
}
答案 1 :(得分:3)
intersectsNode使用calculateAccumulatedFrame方法。
在SpriteKit文档深入介绍了几个地方,在很多情况下你应该用自己的方法覆盖这个方法。读完之后,我最终都在做这件事。 SKShapeNodes就是一个很好的例子。但是如果你将SKNode子类化并用其他内容填充它,你可能也不希望所有内容按照惯例“相交”。
因此覆盖了shapenode子类的calculateAccumulatedFrame方法,它应该再次很好地相交。
答案 2 :(得分:1)
类似的问题,在我的情况下,我比较的一个节点是简单的SKNode将其他节点类型组合在一起。 SKNode有一个位置,但没有宽度,也没有高度,因此它不会相交。任何东西。
对我来说,需要@JoePasq和@Theis Egeberg的答案的组合:
if node.calculateAccumulatedFrame().intersects(sprite.frame) {...
(注意如果两个节点都是简单的SKNodes,那么在两个位置使用caluclateAccuulatedFrame,在我的情况下,sprite是一个SKSpriteNode,所以一个简单的.frame就可以了。)
答案 3 :(得分:0)
我和你有同样的问题。我有一个未声明的数组,因此添加对象没有做任何事情,并且没有要检查的节点。仔细检查你的letterTileArray是不是空的。