楼主能力很强 但是如果想把知识推广的话感觉还是很难 只能照抄一些武将技 我有一个不成熟的小建议 楼主可以把群2里的所有武将技的源码转译成教程里的风格的代码 让吧友自己去琢磨 我看了magic structured点cpp那个文件 真的看不懂
更进一步地,群2中的重力是任意z轴方向上的加速度的一般形式;这是因为我们可以手动指定重力的大小和方向。我们使用SetObjectGravity函数来设置重力的大小:
void SetObjectGravity (int object, int gravity);
其中,gravity指定了重力的大小,gravity为正时重力竖直向下,为负时重力竖直向上。
默认情况下,重力的大小为40960。读者可能已经看出,它的单位和位置、速度的单位都不一样;事实上,重力的大小是比较特殊的,它是每32768等于1点重力加速度(即1像素每Tick平方,或每Tick速度变化1点),也就是65536(0x10000)等于2点重力加速度。因此,默认情况下,重力加速度的大小为1.25。
我们来实际操作一下调整重力的方法。我们先来看OF_NOGRAVITY标记的效果。在ThrowLava函数中,我们使用SetObjectHasGravity函数,指定火球没有重力:
//创建熔岩弹
int lavaSplit = CreateObjectRaw(centerX, centerY, 0, 0, 43004);
//按照给定的三维方向和初速度掷出
SetObjectSpeed_Sphere(lavaSplit, dir, phi, initSpeed);
// 设置熔岩弹没有重力
SetObjectHasGravity (lavaSplit, 0);
从结果上看,毫不意外地放起了烟花:

接着,我们恢复OF_NOGRAVITY标记,但是将重力的值调为一个比较小的数:
//创建熔岩弹
int lavaSplit = CreateObjectRaw(centerX, centerY, 0, 0, 43004);
//按照给定的三维方向和初速度掷出
SetObjectSpeed_Sphere(lavaSplit, dir, phi, initSpeed);
// 设置熔岩弹的重力
SetObjectHasGravity (lavaSplit, 1);
SetObjectGravity(lavaSplit, 5000);
得到了另一种形式的烟花:这一次它们都在远处落了下来。

最后,我们将重力值稳定下来,设置为0x10000的十分之三(等价于0.6像素每Tick平方):
//创建熔岩弹
int lavaSplit = CreateObjectRaw(centerX, centerY, 0, 0, 43004);
//按照给定的三维方向和初速度掷出
SetObjectSpeed_Sphere(lavaSplit, dir, phi, initSpeed);
// 设置熔岩弹的重力
SetObjectHasGravity (lavaSplit, 1);
SetObjectGravity (lavaSplit, 0x10000* 3 / 10);
(细心的读者可能已经注意到,加速度的大小可以是小数,这意味着速度的大小也可以是小数。事实上,底层上,物件的x/y/z速度确实可以为小数,它和屏幕x/y/z坐标有着类似的逻辑:它是一个int型变量,以高2位为整数部分,以低2位为小数部分,因此在内存中1点速度会被储存为0x10000.)
void SetObjectGravity (int object, int gravity);
其中,gravity指定了重力的大小,gravity为正时重力竖直向下,为负时重力竖直向上。
默认情况下,重力的大小为40960。读者可能已经看出,它的单位和位置、速度的单位都不一样;事实上,重力的大小是比较特殊的,它是每32768等于1点重力加速度(即1像素每Tick平方,或每Tick速度变化1点),也就是65536(0x10000)等于2点重力加速度。因此,默认情况下,重力加速度的大小为1.25。
我们来实际操作一下调整重力的方法。我们先来看OF_NOGRAVITY标记的效果。在ThrowLava函数中,我们使用SetObjectHasGravity函数,指定火球没有重力:
//创建熔岩弹
int lavaSplit = CreateObjectRaw(centerX, centerY, 0, 0, 43004);
//按照给定的三维方向和初速度掷出
SetObjectSpeed_Sphere(lavaSplit, dir, phi, initSpeed);
// 设置熔岩弹没有重力
SetObjectHasGravity (lavaSplit, 0);
从结果上看,毫不意外地放起了烟花:

接着,我们恢复OF_NOGRAVITY标记,但是将重力的值调为一个比较小的数:
//创建熔岩弹
int lavaSplit = CreateObjectRaw(centerX, centerY, 0, 0, 43004);
//按照给定的三维方向和初速度掷出
SetObjectSpeed_Sphere(lavaSplit, dir, phi, initSpeed);
// 设置熔岩弹的重力
SetObjectHasGravity (lavaSplit, 1);
SetObjectGravity(lavaSplit, 5000);
得到了另一种形式的烟花:这一次它们都在远处落了下来。

最后,我们将重力值稳定下来,设置为0x10000的十分之三(等价于0.6像素每Tick平方):
//创建熔岩弹
int lavaSplit = CreateObjectRaw(centerX, centerY, 0, 0, 43004);
//按照给定的三维方向和初速度掷出
SetObjectSpeed_Sphere(lavaSplit, dir, phi, initSpeed);
// 设置熔岩弹的重力
SetObjectHasGravity (lavaSplit, 1);
SetObjectGravity (lavaSplit, 0x10000* 3 / 10);
(细心的读者可能已经注意到,加速度的大小可以是小数,这意味着速度的大小也可以是小数。事实上,底层上,物件的x/y/z速度确实可以为小数,它和屏幕x/y/z坐标有着类似的逻辑:它是一个int型变量,以高2位为整数部分,以低2位为小数部分,因此在内存中1点速度会被储存为0x10000.)




















