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

È stato utile?

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)];
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top