在cocos2d中旋转贝塞尔曲线上的精灵

时间:2012-04-03 09:20:42

标签: cocos2d-iphone bezier

我正在尝试使精灵遵循bezier曲线。我在cocos2d网站上发现了一些论坛帖子,并按照指示进行了操作,但我似乎仍然无法让精灵正确旋转。任何人都可以提供帮助。

我添加到BezierBy函数的更新方法中的代码如下

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

可以找到原始文章here

在轮换看起来非常不稳定时,任何帮助都会很棒

2 个答案:

答案 0 :(得分:4)

每当我需要精灵跟随特定的贝塞尔曲线路径并相应地旋转时。我使用CCBezier创建了一个bezier路径。 并使用CCRotateTo方法将精灵旋转到特定角度。旋转的持续时间是bezierAction的持续时间,并且可以手动计算旋转角度。就像在你的pic角度从-45到45。 所以代码可能看起来像这样..

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

相应地填写值。这只是一个片段代码.. :))

答案 1 :(得分:4)

我建议您计算最后一帧期间精灵运动的角度,并使用此值相应地旋转精灵。该方法适用于包括复杂贝塞尔路径在内的各种类型的运动。与提供的其他解决方案相比,这还可以为您节省旋转计时工作。

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

您当然需要将此代码放在一个以lastPosition作为全局变量的更新循环中。