Come faccio a spostare una CGPath senza creare uno nuovo
-
20-09-2019 - |
Domanda
sto creando un CGPath
per definire un'area nel mio gioco in questo modo:
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 );
So che questo è solo un quadrato e che ho potuto solo uso un altro CGRect
ma il percorso desidero creare effettivamente non è in realtà un rettangolo (sto solo testando al momento). E poi rilevare l'area tocco semplicemente con un:
if (CGPathContainsPoint(myPath, nil, location, YES))
Il tutto funziona bene, il problema è che il CGPath
può essere in movimento fino a 40 volte al secondo. Come posso spostare senza dover creare una nuova? So che posso fare qualcosa di simile a "spostare" che:
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 );
Ma devo liberare e creare un nuovo percorso fino a 40 volte al secondo, che credo potrebbe avere una penalizzazione delle prestazioni; è vero?
Mi piacerebbe essere in grado di muoversi proprio come Attualmente sto spostando alcuni CGRects
semplicemente impostando l'origine ad un valore diverso, è questo possibile con CGPath
?
Grazie.
EDIT:. Ho dimenticato di dire che non ho un GraphicsContext come io non sto disegnando su un UIView
Soluzione
applicazione di una trasformazione alla CGPath e prova contro un punto, equivale ad applicare il inversa trasformazione al punto.
Pertanto, è possibile utilizzare
CGPoint adjusted_point = CGPointMake(location.x - center.x, location.y - center.y);
if (CGPathContainsPoint(myPath, NULL, adjusted_point, YES))
Ma CGPathContainsPoint
tiene già un parametro CGAffineTransform
(che avete NULL
-ed esso), in modo da poter utilizzare anche
CGAffineTransform transf = CGAffineTransformMakeTranslation(-center.x, -center.y);
if (CGPathContainsPoint(myPath, &transf, location, YES))
Se si sta disegnando, invece di cambiare il percorso, è possibile modificare il marchio comunitario nel codice di disegno direttamente.
CGContextSaveGState(c);
CGContextTranslateCTM(c, center.x, center.y);
// draw your path
CGContextRestoreGState(c);
Usa un CAShapeLayer
se avete bisogno di prestazioni.
Altri suggerimenti
@ risposta di KennyTM ha funzionato perfettamente per lo scopo del PO, ma la domanda rimane:
Come faccio a spostare una CGPath senza creare una nuova?
Bene, due righe di codice ha fatto il trucco per me:
UIBezierPath* path = [UIBezierPath bezierPathWithCGPath:cgPath];
[path applyTransform:CGAffineTransformMakeTranslation(2.f, 0.f)];