Wie kann ich einen CGPath bewegen, ohne einen neuen zu erstellen?
-
20-09-2019 - |
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
.
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)];