使用SKShapeNode和CGPath在Sprite Kit中绘制虚线

And*_*yal 5 cgpath ios uibezierpath sprite-kit skshapenode

我想在我的精灵工具包游戏中绘制一条虚线,我可以使用SKShapeNode节点绘制如下的法线:

 UIBezierPath *_path=[UIBezierPath bezierPath];
 //1
 CGPoint point1 = CGPointMake(100,100);
 CGPoint point2 = CGPointMake(150,150);
 [_path moveToPoint:point1];
 [_path addLineToPoint:point2];
 //2
 SKShapeNode *line = [SKShapeNode node];
 line.path = _path.CGPath;
Run Code Online (Sandbox Code Playgroud)

我尝试将虚线模式设置为UIBezierPath,如下所示:

// adding this code at location 1 or 2 above but no effect
CGFloat dashes[] = {6, 2};
[_path setLineDash:dashes count:2 phase:0];
Run Code Online (Sandbox Code Playgroud)

但是没有应用虚线图案.

我还尝试直接从UIBezierpath.CGPath属性创建CGPath的虚线副本,如下所示:

 CGFloat dashes[] = {6, 2};
 CGPathRef aCGPath= CGPathCreateCopyByDashingPath(_path.CGPath,NULL,0,dashes,2);
line.path = aCGPath;
Run Code Online (Sandbox Code Playgroud)

但也一样.

我真的很感激,如果有人可以解释什么是问题,我怎么能通过将虚线cgpath应用到skshapenode在两点之间画一条虚线.

编辑:我知道这个简单的例子我可以将这两个点之间的距离分成小的固定距离,并通过bezeirpath移动和绘制虚线但是考虑一个带有点来自触摸的自由手路径,重绘是非常复杂和低效的具有固定长度点的路径然后绘制破折号.我想知道是否有办法将虚线模式应用于路径并使skshapenode使用它是我的问题.

Pul*_*sar 9

如果有人仍然对这个问题的简单答案感兴趣:

使用CGPathCreateCopyByDashingPath创建虚线的副本- [UIBezierCurve CGPath]

CGPathRef CGPathCreateCopyByDashingPath(
   CGPathRef path,
   const CGAffineTransform *transform,
   CGFloat phase,
   const CGFloat *lengths,
   size_t count
);
Run Code Online (Sandbox Code Playgroud)

并将其添加到SKShapeNodepath属性.

例:

    // creates a dashed pattern
    CGFloat pattern[2];
    pattern[0] = 10.0;
    pattern[1] = 10.0;
    CGPathRef dashed =
    CGPathCreateCopyByDashingPath([bezierPath CGPath],
                                  NULL,
                                  0,
                                  pattern,
                                  2);

    self.myShapeNode.path = dashed;

    CGPathRelease(dashed);
Run Code Online (Sandbox Code Playgroud)

编辑:出于性能考虑,您可以将添加SKShapeNodeSKEffectNode并设置shouldRasterize属性YES.