教程中给出的一个桔色方块,通过键盘方向键控制其移动,可以看到虽然寥寥几行代码,但是移动过程中有加速和减速的过程,很好奇它是如何实现的。
关键变量:
speed: 用来控制步进的系数.
dx: 实际的步进值
dt: 一个时钟周期,调用Timer_GetDelta获得
FrameFunc的每一次循环,实际上就是计算目标的步进值(实际上每次循环步进很小的值)
1. FrameFunc中的每次循环, 检测到按键按下,则开始计算步进值
dx += speed * dt; // 100 * 0.01
可以看到如果一直按着按键,则dx会持续增加,从而造成加速的效果。
2. 计算摩擦造成步进减少
dx *= friction; // friction为0.98(可以看到每次减少很小的值,我们可以改变此值使加速/减速过程变得更平滑)
3. 改变方块的坐标
par->MoveTo(x,y);
4. 松开按键,减速
由于没有检测到按键按下,跳过了步骤1,所以随着步骤2摩擦次数的影响,步进值逐渐降为0
关键变量:
speed: 用来控制步进的系数.
dx: 实际的步进值
dt: 一个时钟周期,调用Timer_GetDelta获得
friction: 摩擦系数,相当于每步进一次扣除一定的步进数
流程FrameFunc的每一次循环,实际上就是计算目标的步进值(实际上每次循环步进很小的值)
1. FrameFunc中的每次循环, 检测到按键按下,则开始计算步进值
dx += speed * dt; // 100 * 0.01
可以看到如果一直按着按键,则dx会持续增加,从而造成加速的效果。
2. 计算摩擦造成步进减少
dx *= friction; // friction为0.98(可以看到每次减少很小的值,我们可以改变此值使加速/减速过程变得更平滑)
3. 改变方块的坐标
par->MoveTo(x,y);
4. 松开按键,减速
由于没有检测到按键按下,跳过了步骤1,所以随着步骤2摩擦次数的影响,步进值逐渐降为0