Cocos2D Bezier随着时间的推移越来越快

时间:2016-02-29 06:48:35

标签: c++ ios performance cocos2d-x

我对C ++ / Cocos2d很陌生,但我一直在取得很好的进展。 :)

我想要做的是让玩家获得硬币后在屏幕上“掉落”。我已成功地以两种不同的方式实现它,但每种方式都有重大缺点。

目标:玩家获得一枚硬币后,硬币应“跳”,然后从屏幕上“掉落”。理想情况下,硬币就好像受到重力作用一样,所以它以快速的速度跳起,减速到停止,然后以越来越高的速度向下移动。

到目前为止的尝试:

  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动作,但这会产生笨拙的'尖尖'曲线和速度的尴尬变化,所以不是真正的解决方案。

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

1 个答案:

答案 0 :(得分:0)

是的,我遇到了类似的情况。这就是“放松”的地方。派上用场了。您可以使用许多内置的缓动功能,例如Ease In或Ease Out。所以你的新代码看起来像是:

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

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

为了您的目的(随着时间的推移,速度越来越快),我建议您尝试“舒适”。方法