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

时间:2010-02-12 21:04:07

标签: iphone core-graphics cgpath

我正在创建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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

@ KennyTM的回答完全符合OP的目的,但问题仍然存在:

  

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

嗯,两行代码为我做了诀窍:

UIBezierPath* path = [UIBezierPath bezierPathWithCGPath:cgPath];
[path applyTransform:CGAffineTransformMakeTranslation(2.f, 0.f)];