intersectsNode未检测到交集

时间:2013-12-19 03:20:09

标签: ios objective-c ios7 sprite-kit

我正在使用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;

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

4 个答案:

答案 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是不是空的。