Cocos2dx源码分析之JumpBy的实现
2016-01-20 13:05
555 查看
大部分内容转载自 搬砖老男人 所撰写的 “Cocos2dx源码分析之JumpBy的实现”
原文链接:http://superclass.me/archives/83#comment-6
下面这两行比较难以理解,
这里首先要弄清楚参数t的含义,通过查看源码可知,t是已过去的时间elapsed和动作总时间duration的比值,也就是说
t = elapsed/duration, 表示整个动作进度的百分比,取值0~1。
由于我们需要在duration秒内跳jumps次,那么每次跳跃需要时间
t1 = duration/jumps,
可推出
t * jumps
= elapsed *jumps/duration
= elapsed /t1
假设当前已跳完n次,正在跳第n+1次,且第n+1次已过去p秒,则
elapsed=n*t1+p
于是,
t * jumps = (n*t1 + p)/t1=n+p/t1
于是就得出
float frac
=fmodf(t*jumps,1.0f)
=p/t1
=当前跳跃已完成的百分比
好,现在已经弄明白frac的含义了,下面就简单了,
以frac为横坐标,高度为纵坐标建立坐标系,考虑如上图的抛物线,y=a*x*x+b*x+c,我们以节点起跳的位置为原点,则
在x=0处,高度为0,因为还没起跳
在x=1处,高度为0,因为已经落地
在x=0.5处,高度达到最高点height
所以得出
c=0,
a+b+c=0,
a/4 +b/2+c=height,
解方程组得到
c=0,
a=-4*height,
b=4*height,
于是原方程可表示为
y=-4*height*x*x+ 4*height*x
=4*height*x*(1-x)
到此完全推导出代码中的公式
原文链接:http://superclass.me/archives/83#comment-6
[code]void JumpBy::update(float t) { // parabolic jump (since v0.8.2) if (_target) { // 以下两行较难理解,下面单独分析。 float frac = fmodf( t * _jumps, 1.0f ); float y = _height * 4 * frac * (1 - frac); // 此时刻,从起始点到目的地y轴移动的分量,加上此时刻的跳跃动作y轴移动的分量。 y += _delta.y * t; float x = _delta.x * t; // 此时刻,从起始点到目的地x轴移动的分量。 #if CC_ENABLE_STACKABLE_ACTIONS // 支持多个动作同时作用于同一物体上的效果。 Vec2 currentPos = _target->getPosition(); Vec2 diff = currentPos - _previousPos; _startPosition = diff + _startPosition; Vec2 newPos = _startPosition + Vec2(x,y); _target->setPosition(newPos); _previousPos = newPos; #else _target->setPosition(_startPosition + Vec2(x,y)); // 更新位置。 #endif // !CC_ENABLE_STACKABLE_ACTIONS } }
下面这两行比较难以理解,
[code]float frac = fmodf( t * _jumps, 1.0f ); float y = _height * 4 * frac * (1 - frac);
这里首先要弄清楚参数t的含义,通过查看源码可知,t是已过去的时间elapsed和动作总时间duration的比值,也就是说
t = elapsed/duration, 表示整个动作进度的百分比,取值0~1。
由于我们需要在duration秒内跳jumps次,那么每次跳跃需要时间
t1 = duration/jumps,
可推出
t * jumps
= elapsed *jumps/duration
= elapsed /t1
假设当前已跳完n次,正在跳第n+1次,且第n+1次已过去p秒,则
elapsed=n*t1+p
于是,
t * jumps = (n*t1 + p)/t1=n+p/t1
于是就得出
float frac
=fmodf(t*jumps,1.0f)
=p/t1
=当前跳跃已完成的百分比
好,现在已经弄明白frac的含义了,下面就简单了,
以frac为横坐标,高度为纵坐标建立坐标系,考虑如上图的抛物线,y=a*x*x+b*x+c,我们以节点起跳的位置为原点,则
在x=0处,高度为0,因为还没起跳
在x=1处,高度为0,因为已经落地
在x=0.5处,高度达到最高点height
所以得出
c=0,
a+b+c=0,
a/4 +b/2+c=height,
解方程组得到
c=0,
a=-4*height,
b=4*height,
于是原方程可表示为
y=-4*height*x*x+ 4*height*x
=4*height*x*(1-x)
到此完全推导出代码中的公式
相关文章推荐
- cocos studio 2.3.3制作骨骼动画
- 使用Cocos2d-x实现微信“天天爱消除”炫耀button特效
- cocos2d-x嵌入移动MM短代支付IAP2.4的SDK,点击支付崩溃的解决的方法
- cocos2d-x2.2.3和android平台环境的搭建
- cocos2d-x-2.2.3和vs2012环境配置
- 【cocos2d-x 2.x 学习与应用总结】11: 理解CCGLProgram
- cocosstudio 面板 和层 和 图片的触碰
- 如何优化cocos2d/x程序的内存使用和程序大小
- 【cocos2d-x 2.x 学习与应用总结】10: cocos2d-x自带的shader及其使用
- cocos-js 播放cocos studio创建的时间轴场景动画
- 解决Cocos3.2以上版本在Android5.0崩溃的问题
- cocos游戏开发之海岛冒险1
- Cocos2d-x Tutorial C++ 类到 Lua
- cocos2dx-js 帧动画的播放方法
- Cocos2D-x 中的核心类
- 【Cococs2d-x】通过TexturePacker加密图片资源(Cocos2d-x方式)
- Cocos2dx-JS 在 Sprite 上使用 Shader
- 比较Cocos2d-x 2.x版本与3.x版本屏幕截图的两种方式
- cocos2dx学习<一>cocostudio界面交互
- cocos2dx sqlite3存储信息