SKShapeNode检测两条线交叉点

时间:2015-05-30 09:48:15

标签: ios iphone swift sprite-kit skspritenode

我正在处理一个应用程序,我正在根据用户手指的用户触摸绘制线条。一旦接收到触摸结束事件,该行将被转换为最后一个路径。使用名称"当前路径"绘制新行。当新触摸开始收到事件时节点。我为具有相反接触位掩码的线添加了物理体,但我无法接收碰撞事件。 以下是我的代码:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch* touch = [touches anyObject];
    CGPoint positionInScene = [touch locationInNode:self];
    currentPath = CGPathCreateMutable();
    currentPathNode = [self newLineNodeWithFillColor :  CURRENT_LINE_COLOR];
    CGPathMoveToPoint(currentPath, NULL, positionInScene.x, positionInScene.y);
    currentPathNode.path = currentPath;
    [self addChild:currentPathNode];
    uint32_t contactBitMask = circleCategory | lastPathCategory;
    [self addPhysicsBodyForLine:currentPathNode withCategoryBitMask:drawPathCategory withContactBitMask:contactBitMask];
}
- (void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
{
    UITouch* touch = [touches anyObject];
    CGPoint positionInScene = [touch locationInNode:self];
    CGPathAddLineToPoint(currentPath, NULL, positionInScene.x, positionInScene.y);
    currentPathNode.path = currentPath;
    uint32_t contactBitMask = lastPathCategory;
    [self addPhysicsBodyForLine:currentPathNode withCategoryBitMask:drawPathCategory withContactBitMask:contactBitMask];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    if(lastPath == nil){
        lastPath = CGPathCreateMutable();
    }
    CGPathAddPath(lastPath, nil, currentPath);
    [lastPathNode removeFromParent];
    if(currentPathNode != nil){
        [currentPathNode removeFromParent];
        currentPathNode = nil;
    }
    lastPathNode = [self newLineNodeWithFillColor : LAST_LINE_COLOR];
    lastPathNode.path = lastPath;
    [self addChild:lastPathNode];
    [self addPhysicsBodyForLine:lastPathNode withCategoryBitMask:lastPathCategory withContactBitMask:drawPathCategory];
    CGPathRelease(currentPath);
}  
- (void) addPhysicsBodyForLine:(SKShapeNode*)node withCategoryBitMask:(uint32_t)category withContactBitMask:(uint32_t)contactBitMask{
    node.physicsBody =  [SKPhysicsBody bodyWithEdgeChainFromPath:node.path];
    node.physicsBody.categoryBitMask    = category;
    node.physicsBody.contactTestBitMask = contactBitMask;
    node.physicsBody.collisionBitMask = contactBitMask;
    node.physicsBody.dynamic          = YES;
    node.physicsBody.usesPreciseCollisionDetection = YES;
}

但未检测到碰撞?任何解决方案。

1 个答案:

答案 0 :(得分:1)

碰撞不起作用。如果使用物理移动节点的位置,则只会注册碰撞。在已经存在的物理体上(或跨越)创建一个新的物理体不会记录碰撞。

每次绘制新路径时都可以使用-(BOOL)intersectsNode:(SKNode *)node来检查新节点是否与任何其他节点相交。