2015-05-30 15 views
0

我正在处理一个应用程序,并且正在基于用户手指的用户触摸来绘制线条。一旦收到该行的触摸结束事件被转换为最后一个路径。当接收到新的触摸开始事件时,新行将被命名为“当前路径”节点。我为具有相反接触位掩码的行添加了物理主体,但我无法接收碰撞事件。 以下是我的代码:SKShapeNode检测两条线交点

- (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

碰撞不能这样工作。如果您使用物理来移动节点的位置,则只会注册一个碰撞。在一个已经存在的物理体上创建一个新的物理体将不会注册一个碰撞。

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