2012-04-03 10 views
3

Ich versuche, ein Sprite einer Bezier-Kurve folgen zu lassen. Ich fand ein paar Forenbeiträge auf der cocos2d Seite und folgte den Anweisungen, aber ich scheine immer noch nicht in der Lage zu sein, das Sprite richtig rotieren zu lassen. Kann jemand helfen.Rotieren eines Sprites auf einer Bezier-Kurve in cocos2d

Der Code habe ich in die Update-Methode der Funktion wird BezierBy wie folgt hinzugefügt

float qx = (powf(1-t,2)*xa + 2*(1-t)*t*xb+powf(t,2)*xc); 
float qy = (powf(1-t,2)*ya + 2*(1-t)*t*yb+powf(t,2)*yc); 

double deltaX = x-qx; 
double deltaY = y-qy; 

double degrees = (-180/M_PI)*ccpToAngle(CGPointMake(deltaX,deltaY)); 

[target_ setRotation:degrees]; 

Der Originalartikel gefunden here scheint die Rotation im Moment wäre toll Jede Hilfe

werden kann ganz erratisch

+0

Ich habe ein Bild des Problems hochgeladen, auf dem Foto können Sie sehen, der Hund ist nicht in die Richtung der Linie gedreht [Link] (http://twitpic.com/950mgp) –

Antwort

4

Immer wenn ich brauche ein Sprite auf einem bestimmten Bézier Weg folgen und entsprechend drehen. Ich erstelle einen Bezier Pfad mit CCBezier. Und verwenden Sie die Methode CCRotateTo, um das Sprite in einen bestimmten Winkel zu drehen. Die Dauer der Drehung ist Dauer der BezierAction und Drehwinkel kann manuell berechnet werden. Wie in Ihrem pic Winkel von -45 bis 45. So Code wie folgt aussehen könnte ..

ccBezierConfig bezier; 
bezier.controlPoint_1 = ccp(0, s.height/2); 
bezier.controlPoint_2 = ccp(300, -s.height/2); 
bezier.endPosition = ccp(300,100); 

id bezierForward = [CCBezierBy actionWithDuration:10 bezier:bezier]; 
[sprite runAction:bezierForward]; 

[sprite setRotation:-45]; 
[sprite runAction:[CCRotateTo actionWithDuration:10 angle:45]]; 

Fill entsprechend Werte .. Dies ist nur ein Ausschnitt Code .. :)

+0

Danke, aber ich bin mir nicht sicher Dies funktioniert mit mehreren Kontrollpunkten und einer Startposition –

+0

dies könnte funktionieren .. aber für mehrere Kontrollpunkte müssen Sie möglicherweise Drehaktionen in CCSequence hinzufügen .. M nt sicher, wie ich neva versuchte dies .. :) –

+0

Danke, ich habe löste das Problem, indem er einfach ein Array mit mehreren Punkten hatte und sich während der Bewegung drehte. –

4

Ich würde vorschlagen Sie berechnen den Winkel der Sprites-Bewegung während des letzten Frames und verwenden diesen Wert, um das Sprite entsprechend zu drehen. Diese Methode funktioniert für jede Art von Bewegung, einschließlich komplizierter Bezier-Pfade. Dies spart Ihnen auch die Arbeit der zeitlichen Abstimmung der Rotation auf die Bewegung im Vergleich zu der anderen angebotenen Lösung.

CGPoint vector = ccpSub(sprite.position, lastPosition); 
sprite.rotation = atan2(vector.x, vector.y) * 180/M_PI; 
lastPosition = sprite.position; 

Sie brauchen natürlich mit lastPosition als globalem Variable diesen Code in einer Update-Schleife zu setzen.

+0

Sie werden natürlich müssen Setzen Sie diesen Code in eine Update-Schleife mit lastPosition als globale Variable. – RajivSK