我正在尝试使精灵遵循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
在轮换看起来非常不稳定时,任何帮助都会很棒
答案 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
作为全局变量的更新循环中。