六、阻力
除重力外,另一个加速度维度是阻力。当阻力加速度为正数时,阻力加速度的方向永远与当前速度的方向反向。在三国2脚本中,我们使用SetObjectFriction和SetObjectFriction1两个函数指定物件受到的阻力加速度大小:
void SetObjectFriction (int object, int friction);
void SetObjectFriction1 (int object, int frictionTimes0x10000);
阻力的单位是正常的单位:1点阻力就等于1点加速度,也即1 Tick中速度减小1点。不过,和重力加速度一样,1点阻力实在是太大了,只能设置整数的阻力是很不方便的;因此,三国2脚本提供了另一个函数SetObjectFriction1,它的参数中0x10000(65536)等价于1点阻力加速度,这使得我们可以设置非整数的阻力大小。例如,当设置为0x10000 / 2时,即为0.5点阻力。
我们的武将技中不会涉及阻力。不过,为了演示阻力的作用,我们仍然会利用目前的代码,并且,这一部分代码中的一部分将会保留下来。
我们希望当火球落地,开始向四面八方滚动时,火球会慢慢受到地面摩擦力的作用而停下来。为了实现这一点,我们另外编写一个函数监测每个火球的z坐标,并在火球落地后,设置火球的阻力为三分之一:
这里的do...while是有意为之。因为在刚抛出火球时,火球的z坐标刚好是0,因此需要等1 Tick,等到火球飞起来之后再检查z坐标。
在ThrowLava函数中,每抛出一个火球,我们就异步调用调用一次TraceLavaSplit函数,这样就确保了每个火球都有一个函数正在监测:
编译运行。可以看到,地面上的火球在滚动中迅速放慢,最后停下来了。
阻力加速度也可以被设置为负数,此时表现为加速。
除重力外,另一个加速度维度是阻力。当阻力加速度为正数时,阻力加速度的方向永远与当前速度的方向反向。在三国2脚本中,我们使用SetObjectFriction和SetObjectFriction1两个函数指定物件受到的阻力加速度大小:
void SetObjectFriction (int object, int friction);
void SetObjectFriction1 (int object, int frictionTimes0x10000);
阻力的单位是正常的单位:1点阻力就等于1点加速度,也即1 Tick中速度减小1点。不过,和重力加速度一样,1点阻力实在是太大了,只能设置整数的阻力是很不方便的;因此,三国2脚本提供了另一个函数SetObjectFriction1,它的参数中0x10000(65536)等价于1点阻力加速度,这使得我们可以设置非整数的阻力大小。例如,当设置为0x10000 / 2时,即为0.5点阻力。
我们的武将技中不会涉及阻力。不过,为了演示阻力的作用,我们仍然会利用目前的代码,并且,这一部分代码中的一部分将会保留下来。
我们希望当火球落地,开始向四面八方滚动时,火球会慢慢受到地面摩擦力的作用而停下来。为了实现这一点,我们另外编写一个函数监测每个火球的z坐标,并在火球落地后,设置火球的阻力为三分之一:
这里的do...while是有意为之。因为在刚抛出火球时,火球的z坐标刚好是0,因此需要等1 Tick,等到火球飞起来之后再检查z坐标。
在ThrowLava函数中,每抛出一个火球,我们就异步调用调用一次TraceLavaSplit函数,这样就确保了每个火球都有一个函数正在监测:
编译运行。可以看到,地面上的火球在滚动中迅速放慢,最后停下来了。
阻力加速度也可以被设置为负数,此时表现为加速。