Cocos2D BezierBy 随着时间的推移而增加速度
Cocos2D BezierBy with increasing speed over time
我对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"方法。
- 数组索引的值没有增加
- 为什么我的代码在输出中增加了93天
- 有效地使用std::unordered_map来插入或增加键的值
- C++ 动态数组每次添加时将大小增加 1 - 错误
- 为什么要增加导致崩溃的指针
- 增加传递地址的值
- 如何增加以前由新运算符分配的 C++ std::list 数组的大小?
- 为什么"i"在循环的每次迭代中都没有增加?(C++)
- std::thread 增加 DLL 引用计数,从而防止卸载 DLL
- MFC:你能在CDateTimeCtrl中改变自旋的加速度吗?
- 如何在C++中为增加但记住删除先前对象的对象分配唯一标识符
- 将一对插入地图并增加计数?
- 整数类型应该显式转换(例如"int"到"无符号")还是只会增加混乱?
- 我的 c++ 应用程序中的运行时间从 0 增加到 60 太快了(例如一毫秒或一微秒)
- 如何获取加速度值?
- 为什么当通过 TCP 发送的消息速率增加时,请求-响应消息对的延迟会降低?
- 琐碎并发代码的吞吐量不会随着线程数量的增加而增加
- C++:功能在输出前自动使用50减/增加输入数
- 追加位以增加字符的大小
- 为什么在C++中增加指针后打印了一个值而不是 NULL/0?