どのように私は新しいものを作成せずにCGPathに移動することができ
-
20-09-2019 - |
質問
私はこのような私のゲーム内の領域を定義するためのCGPath
を作成しています:
CGPathMoveToPoint ( myPath, NULL, center.x, center.y );
CGPathAddLineToPoint( myPath, NULL,center.x + 100, center.y);
CGPathAddLineToPoint( myPath, NULL, center.x + 100, center.y + 100);
CGPathAddLineToPoint( myPath, NULL, center.x, center.y + 100);
CGPathCloseSubpath ( myPath );
私はこれがちょうど正方形であり、私はちょうど別のCGRect
を使用することができますが、私は実際に作成したいパスが実際に長方形(私は現時点ではテストしてい)ではないことを知っています。そして、と単純にタッチ領域を検出します:
if (CGPathContainsPoint(myPath, nil, location, YES))
このすべてが正常に動作し、問題はCGPath
は、毎秒40回まで移動することができることです。どのように私は新しいものを作成することなく、それを移動することができますか?私はそれを「移動」するために、このような何かを行うことができます知っています:
center.y += x;
CGPathRelease(myPath);
myPath = CGPathCreateMutable();
CGPathMoveToPoint ( myPath, NULL, center.x, center.y );
CGPathAddLineToPoint( myPath, NULL,center.x + 100, center.y);
CGPathAddLineToPoint( myPath, NULL, center.x + 100, center.y + 100);
CGPathAddLineToPoint( myPath, NULL, center.x, center.y + 100);
CGPathCloseSubpath ( myPath );
しかし、私はパフォーマンスの低下を持っているかもしれないと思う毎秒40回、最大新しいパスをリリースして作成する必要があります。これは本当ですか?
私はちょうど私は現在、単に異なる値に起源を設定することにより、いくつかのCGRects
を動かしていますようにそれを移動できるようにしたいと思い、CGPath
でこの可能ですか?
ありがとうございます。
編集:私は私がUIView
に描くわけではないようGraphicsContextを持っていない言及を忘れてしまった。
解決
点に対してCGPathに、テストに変換を適用し、ポイントに逆の変換を適用することと等価である。
そのため、あなたが使用することができます。
CGPoint adjusted_point = CGPointMake(location.x - center.x, location.y - center.y);
if (CGPathContainsPoint(myPath, NULL, adjusted_point, YES))
しかし、あなたはまた、使用できるようにCGPathContainsPoint
はすでに、CGAffineTransform
パラメータ(あなたがいるNULL
-EDそれを)かかり
CGAffineTransform transf = CGAffineTransformMakeTranslation(-center.x, -center.y);
if (CGPathContainsPoint(myPath, &transf, location, YES))
<時間>
あなたが描く、代わりのパスを変更する場合は、直接描画コードでCTMを変更することができます。
CGContextSaveGState(c);
CGContextTranslateCTM(c, center.x, center.y);
// draw your path
CGContextRestoreGState(c);
あなたはパフォーマンスが必要な場合CAShapeLayer
を使用します。
他のヒント
KennyTMの答え@ OPの目的のために完璧に働いたが、疑問は残るます:
の私は新しいものを作成せずにCGPathにを移動できますか?の
さて、2行のコードは私のためにトリックをしました。
UIBezierPath* path = [UIBezierPath bezierPathWithCGPath:cgPath];
[path applyTransform:CGAffineTransformMakeTranslation(2.f, 0.f)];