簡體   English   中英

SKShapeNode檢測兩行相交

[英]SKShapeNode Detect Two Lines Intersection

我正在開發一個應用程序,並且正在根據用戶手指的觸摸來畫線。 收到觸摸結束事件后,該行將轉換為最后一條路徑。 當收到新的觸摸開始事件時,將繪制一條名為“當前路徑”節點的新行。 我為兩條帶有相反接觸位掩碼的線添加了一個物理實體,但是我無法接收碰撞事件。 以下是我的代碼:

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

但是沒有檢測到碰撞? 任何解決方案。

碰撞不是那樣的。 如果您使用物理學來移動節點的位置,則僅會記錄碰撞。 在(或橫跨)已經存在的物理物體上創建新的物理物體將不會記錄碰撞。

每次繪制新路徑時,都可以使用-(BOOL)intersectsNode:(SKNode *)node來檢查新節點是否與任何其他節點相交。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM