Frage

Ich erstelle a CGPath Um einen Bereich in meinem Spiel wie diesem zu definieren:

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

Ich weiß, dass dies nur ein Quadrat ist und dass ich einfach einen anderen verwenden könnte CGRect Aber der Weg, den ich tatsächlich erstellen möchte, ist eigentlich kein Rechteck (ich teste gerade im Moment). Und dann den Berührungsbereich einfach mit a: Erkennen:

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

Dies alles funktioniert einwandfrei, das Problem ist, dass die CGPath kann sich bis zu 40 Mal pro Sekunde bewegen. Wie kann ich es bewegen, ohne eine neue erstellen zu müssen? Ich weiß, dass ich so etwas tun kann, um es zu "bewegen":

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

Aber ich muss veröffentlichen und einen neuen Weg bis zu 40 Mal pro Sekunde erstellen, was meiner Meinung nach eine Leistungsstrafe haben könnte. Ist das wahr?

Ich möchte es so bewegen können, wie ich mich gerade mit etwas bewege CGRects Wenn Sie einfach den Ursprung auf einen anderen Wert setzen, ist dies möglich mit CGPath?

Vielen Dank.

EDIT: Ich habe vergessen zu erwähnen, dass ich keinen Grafikkontext habe, da ich nicht auf a zeichne UIView.

War es hilfreich?

Lösung

Die Anwendung einer Transformation auf den CGPath und die Prüfung gegen einen Punkt ist gleichbedeutend mit der Anwendung des umgekehrt Transformation auf den Punkt.

Daher können Sie verwenden

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

Aber CGPathContainsPoint nimmt schon a CGAffineTransform Parameter (den Sie haben NULL-Ed es), damit Sie auch verwenden können

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

Wenn Sie zeichnen, können Sie den CTM in Ihrem Zeichencode direkt ändern, anstatt den Pfad zu ändern.

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

Verwenden ein CAShapeLayer Wenn Sie Leistung benötigen.

Andere Tipps

@Kennytms Antwort funktionierte perfekt für den Zweck des OP, aber die Frage bleibt:

Wie kann ich einen CGPath bewegen, ohne einen neuen zu erstellen?

Nun, zwei Codezeilen haben mir den Trick gemacht:

UIBezierPath* path = [UIBezierPath bezierPathWithCGPath:cgPath];
[path applyTransform:CGAffineTransformMakeTranslation(2.f, 0.f)];
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top