5

我想在我的精灵工具包游戏中画一条虚线,我可以使用 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;

我试图为 UIBezierPath 设置一个虚线模式,如下所示:

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

但不应用虚线图案。

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

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

但也一样。

如果有人可以解释问题出在哪里,以及如何通过将虚线 cgpath 应用于 skshapenode 来在两点之间绘制虚线,我真的很感激。

编辑:我知道对于这个简单的示例,我可以将这两个点之间的距离划分为小的固定距离,并通过 bezeirpath 移动和绘制虚线,但考虑到点来自触摸的徒手路径,重绘非常复杂且效率低下具有固定长度点的路径然后绘制破折号。我想知道是否有办法将虚线图案应用于路径并使 skshapenode 使用它,这是我的问题。

4

2 回答 2

9

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

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

CGPathRef CGPathCreateCopyByDashingPath(
   CGPathRef path,
   const CGAffineTransform *transform,
   CGFloat phase,
   const CGFloat *lengths,
   size_t count
);

并将其添加到SKShapeNode' 的path属性中。

例子:

    // 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);

编辑:为了提高性能,您可以将 an 添加SKShapeNode到 anSKEffectNode并将shouldRasterize属性设置为YES.

于 2014-06-25T10:34:25.697 回答
0

将位置 1 的代码更改为如下所示:

UIBezierPath *_path=[UIBezierPath bezierPath];
CGPoint point1 = CGPointMake(100,100);
CGPoint point2 = CGPointMake(150,150);
CGFloat deltaX = 1;
CGFloat deltaY = 1;
CGPoint tmpPoint = point1;
[_path moveToPoint:point1];
while(tmpPoint.x<point2.x && tmpPoint.y<point2.y){
    tmpPoint.x+=deltaX;
    tmpPoint.y+=deltaY;
    if((tmpPoint.y-point1.y)%2==1){
       [_path addLineToPoint:tmpPoint];
    }else{
      [_path moveToPoint:tmpPoint];
    }
}
// If the line is not a 45 degree straight line
// Please modify the while loop accordingly
[_path addLineToPoint:point2];
于 2013-12-27T13:52:56.253 回答