在cocos2d中,通过贝塞尔曲线旋转精灵。

3
我正在尝试让一个精灵沿着贝塞尔曲线移动。我在cocos2d网站上找到了一些论坛帖子,按照指示进行了操作,但似乎仍无法正确旋转精灵。有人能帮忙吗?
我已经将以下代码添加到BezierBy函数的update方法中:
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];

目前旋转看起来相当不稳定,希望能得到任何有关IT技术的帮助。

原始文章可以在这里找到。


我已经上传了一个问题的图片,照片中你可以看到狗没有旋转到线的方向链接 - Jonathan Ogle-Barrington
2个回答

4

每当我需要一个精灵沿着特定的贝塞尔曲线移动并相应旋转时,我使用CCBezier创建一个贝塞尔曲线路径。 然后使用CCRotateTo方法将精灵旋转到特定角度。旋转持续时间为bezierAction的持续时间,旋转角度可以手动计算。就像您的图片中角度从-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]];

填写相应的值。这只是一小段代码.. :)

谢谢,但我不确定这是否适用于多个控制点和起始位置。 - Jonathan Ogle-Barrington
这可能有效...但是对于多个控制点,您可能需要在CCSequence中添加旋转操作。我不确定,因为我从未尝试过... :) - Nikhil Aneja
谢谢,我已经通过拥有多个点的数组并在移动时旋转来解决了这个问题。 - Jonathan Ogle-Barrington
有没有更优雅的解决方案?我正在尝试做这个,但是设置多个点来进行旋转对我来说不太好 :( 需要数学知识,但我不擅长!有什么想法吗?!? - Lagoo87

4

我建议你计算精灵在上一帧运动时的角度,并根据这个值旋转精灵。这种方法适用于所有类型的运动,包括复杂的贝塞尔路径。与其他方案相比,这样做可以节省旋转与运动同步的工作。

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

当然,您需要将这段代码与lastPosition作为全局变量放在更新循环中。


当然,您需要将此代码放入更新循环中,并将lastPosition作为全局变量。 - RajivSK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接