cocos2d iphone - Girar un sprite en una curva de Bezier en cocos2d
cocos2d-iphone (2)
Cada vez que necesito un sprite para seguir en un camino particular Bezier y rotar en consecuencia. Creo un camino más CCBezier
usando CCBezier
. Y usa el método CCRotateTo para girar el sprite a un ángulo particular. La duración de la rotación es la duración de bezierAction y el ángulo de rotación puede calcularse manualmente. Al igual que en su ángulo de imagen es de -45 a 45. Así que el código podría ser así ..
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]];
Complete los valores en consecuencia ... Esto es solo un código de fragmento ... :)
Estoy tratando de hacer que un sprite siga una curva bezier. Encontré algunas publicaciones en el foro en el sitio de Cocos2D y seguí las instrucciones, pero todavía no puedo hacer que el sprite gire correctamente. Alguien puede ayudar.
El código que agregué al método de actualización de la función BezierBy es el siguiente
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];
El artículo original se puede encontrar aquí
Cualquier ayuda sería genial en el momento en que la rotación parece bastante errática
Sugiero que calcules el ángulo del movimiento de los sprites durante el último cuadro y usas este valor para rotar el objeto en consecuencia. Este método funcionará para cada tipo de movimiento, incluidos los senderos de bezier complicados. Esto también le ahorrará el trabajo de sincronizar la rotación con el movimiento en comparación con la otra solución ofrecida.
CGPoint vector = ccpSub(sprite.position, lastPosition);
sprite.rotation = atan2(vector.x, vector.y) * 180 / M_PI;
lastPosition = sprite.position;
Por supuesto, necesitará poner este código en un ciclo de actualización con lastPosition
como una variable global.