2010-02-12 102 views
3

我创建一个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上绘图。

回答

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

+0

那不是移动整个图形上下文,而不是人的路?此外,我忘了提及我没有graphicscontext,因为我没有绘制UIView – 2010-02-12 21:16:44

+0

@OscarMk:哎呀。抱歉。查看更新。 – kennytm 2010-02-12 21:28:55

+0

谢谢,这将帮助我很多!我不需要移动所有的多边形,我只需要翻译我的观点,以前我应该想到这一点。在性能上有什么更好的创建一个新的cgpoint或使用CGAffine变换只是一个问题吗? – 2010-02-12 21:37:19

2

@ KennyTM的回答非常完美的OP的目的,但问题依然存在:

我如何可以移动CGPath而无需创建一个新的?

好了,两行代码为我做的伎俩:

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

还有:CGPathCreateCopyByTransformingPath( CGPathRef路径,常量CGAffineTransform *变换); – alecail 2013-06-30 21:02:45

+0

@Antoine感谢,但仍创造了新的CGPath,这是什么OP试图避免。如果问题更好,代码更简洁,那么您的答案是完美的。 – Mazyod 2013-06-30 21:12:01

+1

是的,我知道。不幸的是,在OP一直在寻找的是OS X NSBezierPath方法'setAssociatedPoints:atIndex:'你可以用这种方法来改变与快速的路径,并没有重新创建路径相关联的点。我希望将来UIBezierPath的行为更像一个NSBezierPath。 – alecail 2013-06-30 21:24:00

相关问题