2012-04-03 94 views
3

我想让一个精灵沿着贝塞尔曲线走。我在cocos2d网站上发现了一些论坛帖子,并按照指示行事,但我似乎仍然无法让精灵正确旋转。任何人都可以帮忙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

我已经上传了一张照片的问题,在照片中你可以看到狗没有旋转到行的方向[链接](http://twitpic.com/950mgp) – 2012-04-03 09:42:13

回答

4

每当我需要一个精灵跟随一个特定的贝塞尔路径并相应地旋转。我使用CCBezier创建了一条贝塞尔路径。 并使用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]]; 

填充相应值。这仅仅是一个代码片段.. :)

+0

谢谢,但我不知道这将工作与多个控制点和起始位置 – 2012-04-03 12:58:05

+0

这可能工作..但对于多个控制点,你可能需要在CCSequence中添加旋转动作.. M nt当然,因为我neva试过这.. .. :) – 2012-04-03 15:30:19

+0

谢谢,我有只需要有多个点并在移动时旋转即可解决问题。 – 2012-04-04 16:30:26

4

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

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

你当然需要把这个代码的更新循环与lastPosition为全局变量。

+0

你当然需要将这段代码放在updatePosition作为全局变量的更新循环中。 – RajivSK 2013-04-12 12:02:40