【问题标题】:Rotating a sprite on a Bezier curve in cocos2d在 cocos2d 中的贝塞尔曲线上旋转精灵
【发布时间】:2012-04-03 09:20:41
【问题描述】:

我正在尝试使精灵遵循贝塞尔曲线。我在 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];

原文可以在here找到

目前轮换似乎非常不稳定,任何帮助都会很棒

【问题讨论】:

  • 我上传了一张问题的图片,在照片中你可以看到狗没有旋转到线link的方向

标签: cocos2d-iphone bezier


【解决方案1】:

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

相应地填写值.. 这只是一个 sn-p 代码.. :)

【讨论】:

  • 谢谢,但我不确定这是否适用于多个控制点和起始位置
  • 这可能有效.. 但对于多个控制点,您可能需要在 CCSequence 中添加旋转操作.. 千万不要确定,因为我试过这个.. :)
  • 谢谢,我已经解决了这个问题,只需要一个多点数组并在移动时旋转。
  • 现在有没有更优雅的解决方案?我正在尝试这样做,但设置多个点来进行旋转对我来说并不酷:(需要数学但我很烂!想法?!?
【解决方案2】:

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

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

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

【讨论】:

  • 您当然需要将此代码放入更新循环中,并将 lastPosition 作为全局变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多