2015-08-18 4 views
1

Я разрабатываю игру с SpriteKit. В моей игре игрок должен иметь возможность рисовать линию и взаимодействовать с ней. Я использую простой SKShapeNode, нарисованный с помощью CGMutablePathRef. Однако, когда я добавляю физический элемент в строку, он автоматически восстанавливает конец строки до начала. В результате, если пользователь рисует кривую, физическое тело является формой полукруга.Физика SpriteKit для линии

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    for (UITouch *touch in touches) { 
     CGPoint location = [touch locationInNode:self]; 
     SKShapeNode *line = [SKShapeNode node]; 
     CGMutablePathRef pathToDraw = CGPathCreateMutable(); 
     CGPathMoveToPoint(pathToDraw, NULL, location.x, location.y); 
     line.path = pathToDraw; 
     [line setStrokeColor:[UIColor redColor]]; 
     [line setLineWidth:5]; 
     [line setLineCap:kCGLineCapRound]; 
     [line setLineJoin:kCGLineJoinRound]; 
     line.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:pathToDraw]; 
     line.physicsBody.dynamic = NO; 
     line.physicsBody.restitution = 1; 
     line.name = @"line"; 
     [self addChild:line]; 
    } 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    SKShapeNode *oldLine = (SKShapeNode *)[self childNodeWithName:@"line"]; 
    CGMutablePathRef pathToDraw = (CGMutablePathRef)oldLine.path; 
    CGPathAddLineToPoint(pathToDraw, NULL, location.x, location.y); 
    [self enumerateChildNodesWithName:@"line" usingBlock:^(SKNode *node, BOOL *stop) { 
     [node removeFromParent]; 
    }]; 

    SKShapeNode *line = [SKShapeNode node]; 
    line.path = pathToDraw; 
    [line setStrokeColor:[UIColor redColor]]; 
    [line setLineWidth:5]; 
    [line setLineCap:kCGLineCapRound]; 
    [line setLineJoin:kCGLineJoinRound]; 
    line.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:pathToDraw]; 
    line.physicsBody.dynamic = NO; 
    line.physicsBody.restitution = 1; 
    line.name = @"line"; 
    [self addChild:line]; 
} 

Я не могу понять, как предотвратить переход пути physicalBody к началу. Любая помощь будет оценена по достоинству. Благодаря!

ответ

1

Следующий код рисует временную строку (белый) при движении пальцем по экрану, а затем рисует финальную строку (красный), когда вы поднимаете палец. Затем код добавляет физическое тело краевой цепи к линии.

@implementation GameScene { 
    SKShapeNode *lineNode; 
    CGPoint startingPoint; 
} 

-(void)didMoveToView:(SKView *)view { 
    self.scaleMode = SKSceneScaleModeResizeFill; 
} 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch* touch = [touches anyObject]; 
    CGPoint positionInScene = [touch locationInNode:self]; 

    startingPoint = positionInScene; 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch* touch = [touches anyObject]; 
    CGPoint positionInScene = [touch locationInNode:self]; 

    // Remove temporary line if it exist 
    [lineNode removeFromParent]; 

    CGMutablePathRef pathToDraw = CGPathCreateMutable(); 
    CGPathMoveToPoint(pathToDraw, NULL, startingPoint.x, startingPoint.y); 
    CGPathAddLineToPoint(pathToDraw, NULL, positionInScene.x, positionInScene.y); 

    lineNode = [SKShapeNode node]; 
    lineNode.path = pathToDraw; 
    lineNode.strokeColor = [SKColor whiteColor]; 
    lineNode.lineWidth = 1; 
    [self addChild:lineNode]; 
} 

- (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event 
{ 
    UITouch* touch = [touches anyObject]; 
    CGPoint positionInScene = [touch locationInNode:self]; 

    // Remove temporary line 
    [lineNode removeFromParent]; 

    CGMutablePathRef pathToDraw = CGPathCreateMutable(); 
    CGPathMoveToPoint(pathToDraw, NULL, startingPoint.x, startingPoint.y); 
    CGPathAddLineToPoint(pathToDraw, NULL, positionInScene.x, positionInScene.y); 

    SKShapeNode *finalLineNode = [SKShapeNode node]; 
    finalLineNode.path = pathToDraw; 
    finalLineNode.strokeColor = [SKColor redColor]; 
    finalLineNode.lineWidth = 1; 

    finalLineNode.physicsBody = [SKPhysicsBody bodyWithEdgeChainFromPath:pathToDraw]; 
    [self addChild:finalLineNode]; 
} 

@end 

enter image description here

Смежные вопросы