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

这一切都很好,问题是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吗?

谢谢你。

编辑:我忘了提到我没有 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-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如果需要性能,请使用 a 。

于 2010-02-12T21:07:20.453 回答
4

@KennyTM 的答案非常适合 OP,但问题仍然存在:

如何在不创建新路径的情况下移动 CGPath?

好吧,两行代码对我有用:

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