3

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

これはすべて正常に動作しますが、問題は がCGPath1 秒間に最大 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 );

しかし、1 秒あたり最大 40 回、新しいパスを解放して作成する必要があり、パフォーマンスが低下する可能性があると思います。これは本当ですか?

CGRects原点を別の値に設定するだけで、現在移動しているように移動できるようにしたいのですが、これは可能CGPathですか?

ありがとうございました。

編集: に描画していないため、GraphicsContext がないことを忘れていましたUIView

4

2 に答える 2

5

CGPath に変換を適用してポイントに対してテストすることは、変換をポイントに適用することと同じです。

したがって、使用できます

CGPoint adjusted_point = CGPointMake(location.x - center.x, location.y - center.y);
if (CGPathContainsPoint(myPath, NULL, adjusted_point, YES)) 

しかし、CGPathContainsPointすでにCGAffineTransformパラメーターをとっています(これをNULL編集しました)ので、使用することもできます

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パフォーマンスが必要な場合はa を使用してください。

于 2010-02-12T21:07:20.453 に答える
4

@KennyTMの答えはOPの目的のために完全に機能しましたが、問題は残ります:

新しいものを作成せずに CGPath を移動するにはどうすればよいですか?

さて、2行のコードでうまくいきました:

UIBezierPath* path = [UIBezierPath bezierPathWithCGPath:cgPath];
[path applyTransform:CGAffineTransformMakeTranslation(2.f, 0.f)];
于 2012-12-08T19:38:02.757 に答える