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 に適用して 2 点間に破線を引く方法を説明できれば、本当に感謝しています。

編集: この単純な例では、これらの 2 つのポイント間の距離を小さな固定距離に分割し、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);

編集: パフォーマンスのために、 を に追加しSKShapeNode、プロパティを にSKEffectNode設定できます。shouldRasterizeYES

于 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 に答える