Question

Je suis en train de créer un CGPath pour définir une zone dans mon jeu comme celui-ci:

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

Je sais que cela est juste un carré et que je pouvais utiliser un autre CGRect mais le chemin que je veux créer est en réalité pas vraiment un rectangle (je suis juste tester pour le moment). Et puis détecter la zone tactile simplement avec:

if (CGPathContainsPoint(myPath, nil, location, YES))

Tout cela fonctionne très bien, le problème est que le CGPath peut se déplacer jusqu'à 40 fois par seconde. Comment puis-je déplacer sans avoir à créer une nouvelle? Je sais que je peux faire quelque chose comme ça pour « déplacer » il:

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

Mais je dois libérer et créer un nouveau chemin jusqu'à 40 fois par seconde, ce qui je pense pourrait avoir une pénalité de performance; est-ce vrai?

Je voudrais être en mesure de le déplacer comme je me déplace actuellement une CGRects en mettant simplement l'origine à une valeur différente, est-ce possible avec CGPath?

Merci.

EDIT:. J'ai oublié de mentionner que je n'ai pas GraphicsContext que je ne suis pas dessin sur une UIView

Était-ce utile?

La solution

L'application d'une transformation à l'essai CGPath et contre un point, est équivalent à l'application de la inverse transformation au point.

Par conséquent, vous pouvez utiliser

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

Mais CGPathContainsPoint prend déjà un paramètre CGAffineTransform (que vous avez NULL-ed), donc vous pouvez également utiliser

CGAffineTransform transf = CGAffineTransformMakeTranslation(-center.x, -center.y);
if (CGPathContainsPoint(myPath, &transf, location, YES)) 

Si vous dessinez, au lieu de changer le chemin, vous pouvez modifier la CTM dans votre code de dessin directement.

CGContextSaveGState(c);
CGContextTranslateCTM(c, center.x, center.y);
// draw your path
CGContextRestoreGState(c);

Utilisez un CAShapeLayer si vous avez besoin de performances.

Autres conseils

@ réponse de KennyTM a parfaitement fonctionné dans le but de l'OP, mais la question demeure:

  

Comment puis-je déplacer un CGPath sans créer un nouveau?

Eh bien, deux lignes de code a fait l'affaire pour moi:

UIBezierPath* path = [UIBezierPath bezierPathWithCGPath:cgPath];
[path applyTransform:CGAffineTransformMakeTranslation(2.f, 0.f)];
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top