Cocos2D BezierBy 随着时间的推移而增加速度

Cocos2D BezierBy with increasing speed over time

本文关键字:增加 加速度 BezierBy 时间 Cocos2D      更新时间:2023-10-16

我对C++/Cocos2d很陌生,但我的进步已经相当不错了。 :)

我想做的是在玩家拿到硬币后将硬币"从屏幕上掉下来"制作动画。我已经设法以 2 种不同的方式成功实现它,但每种方式都有重大缺点。

目标:玩家获得硬币后,硬币应该"跳跃",然后"掉落"屏幕。理想情况下,硬币就像受到重力的作用一样,因此它以快速的速度跳跃,减速停止,然后以越来越快的速度继续向下移动。

到目前为止的尝试:

  void Coin::tick(float dt) {
    velocityY += gravity * dt;
    float newX = coin->getPositionX() + velocityX;
    float newY = coin->getPositionY() + velocityY;
    coin->setPosition(newX, newY);
    // using MoveBy(dt, Vec2(newX, newY)) has same result
  }
  // This is run on every 'update' of the main game loop.

就移动而言,这种方法完全符合我希望它的作用,但是,帧速率变得非常不稳定,它开始在帧之间"跳跃",有时甚至是相当长的距离。

  ccBezierConfig bz;
  bz.controlPoint_1 = Vec2(0, 0);
  bz.controlPoint_2 = Vec2(20, 50); // These are just test values. Will normally be randomized to a degree.
  bz.endPosition = Vec2(100, -2000);
  auto coinDrop = BezierBy::create(2, bz);
  coin->runAction(coinDrop);

这个具有"完美"帧率的好处,没有任何断断续续,但是,它以恒定的速度移动,这破坏了它下降的体验,只是让它看起来像是沿着某个设定的路径任意移动。(嗯,确实如此。

有没有人遇到过类似的情况或知道修复?要么更好地处理第一个的帧速率(MoveBy/To 不起作用 - 仍然具有断断续续的效果),要么以编程方式设置第二个的速度(更改速度进出曲线中的某些点)

我的另一个想法是使用许多不同的MoveBy动作和不同的速度,但这会有尴尬的"尖"曲线和尴尬的速度变化,所以不是真正的解决方案。

任何想法/帮助都非常感谢。 :)

是的,我遇到了类似的情况。这就是"缓和"派上用场的地方。您可以使用许多内置的缓动功能,例如"缓入"或"缓出"。因此,您的新代码将如下所示:

coin->runAction(cocos2d::EaseBounceOut::create(coinDrop));

本页显示了几种常见缓动方法的图表:http://cocos2d-x.org/docs/programmers-guide/4/index.html

出于您的目的(随着时间的推移提高速度),我建议您尝试"EaseIn"方法。