关于burst的多炮管交替射击的方案

首先声明一下,由于时间原因,没有经过很多实际测试,有可能具体原理还有待验证,今天讨论的是有关武器参数里burst的使用的,很多moder都说burst不适合多炮管武器脚本,因为会导致炮管不按脚本顺序乱射,在实际工作中也确实有这类情况发生,但是昨天我在测试一种新武器时无意中发现burst类武器也能按照顺序发射,但是这里似乎有个规律,我不知道是否正确,希望有人看到这个贴子可以回去做一些测试,具体验证一下这个方法是否可行。
具体做法是这样的,由于武器脚本一般通过if命令以及自定义函数让武器实现多炮管交替射击,而burst本身会给武器设定成多弹射击形式,所以会搞乱脚本安排好的顺序,我认为脚本在实行具体程序时会把burst的参数也参考进去,依次去轮替到脚本参数里执行,当具体发生脚本动作时(比如开火),会在执行该脚本的“点”上发生动作,但剩余的burst参数值会在后续脚本函数值之间轮替一次,因此导致脚本顺序错乱(因为轮替最后的点不一定会在正常顺序上,因此会导致顺序错乱,或部分炮管不工作),但如果我们把握住它计算的顺序,应该可以人为的控制burst参数与脚本函数值之间的关系,我目前的具体做法是这样的,如果单位有四根炮管,那就把武器的burst的值设定为“5”,当脚本开始运行时,假设gun_1 = 1; 那burst值前五位会在脚本中轮替一遍,但具体发射动作还在第一根炮管上发生,轮到burst值为“5”时刚好落回第一根炮管上,再轮一遍当gun_1 = 2;时就会从第二根炮管开始发射并做burst值的轮替,最后回到第二根炮管上,以此类推,这样可以保证脚本发射的正常顺序,因此burst的值的设定可以参考“炮管数+1”的公式,或者升级成“炮管数N倍+1”,比如两根炮管时,如果你burst设为“5”仍然可以实现交替设计,因为burst = 22+1, 但如果你burst值是“6”,那么将只有第一根炮管能发射,第二根永远不会发射了。。。

大概原理就是这样,狐狸给看看这个道理是否合理

:L 直接设定一个计数器好了。。。计数器的值就是burst的数量。
计数器到0才换炮管,并重新设置计数器。。。
中途停火了的话,计数器看情况决定是否重置。

计数器?怎么设…

另外问一下狐狸,怎么用脚本实现控制开火?比如我让两根炮管快速交替发射,然后停顿几秒钟,这个脚本具体应该怎么写?给点提示。。。

都是人才。

[

自己设置一个全局的static-var就可以了啊。。。
控制开火的话。在AimPrimary/Secondary/Tertiary代码里用return 0来禁止本次开火,return 1表示允许本次开火。
你只要设置一个全局变量,然后设置一段代码里用sleep指令把这个变量的值从0改为1(或者你自己定别的数字都可以),然后在AimPrimary/Secondary/Tertiary的代码里,判断如果这个值为1,那么就开火(return 1),并执行一次上面的那段代码;如果为0,那么就不开火(return 0)。

对写程序实在是没悟性啊,能不能给了例子参观一下呀,我下载了一些第三方单位,研究里面的脚本,但是很多有理解不了,狐狸给做个科普吧。。。

//全局变量canFire
static-var canFire

//其他代码
...

//单位被创建时执行一次(当单位刚开始被建造时,而不是建造完成的时候)
Create()
{
   ...
   //初始化
   canFire=1;
}

WaitForFire()
{
   //不可开火,等待...后可以再次开火
   canFire=0;
   sleep ...;
   canFire=1;
}

AimPrimary(heading, pitch)
{
   //当单位准备开火时,执行一次
   //heading pitch是先前AimFromPrimary里指定的piece的瞄准角度
   //return 1 表示允许开火,return 0 表示禁止开火
   
   ...
   ...
   //判定是否可以开火        if (canFire == 0)
   {
   //不可开火
   ...
   return 0;
   }
   if (canFire == 1)
   {
   //炮塔转向
   turn turret to y-axis heading speed <...>;
   ...
   //异步执行WaitForFire(),即这里执行完start-script后,立刻执行后续语句
   //同步执行应使用call-script,则这里必须等待call-script的代码执行完毕后返回才能继续执行后续代码
   start-script WaitForFire();
   //后续代码
   return 1;
   }
}

懂了,我以前见过一个程序用的变量叫“reloading”,意思应该给这个差不多,不过没有人讲解,所以没看懂,这样大概知道了。。。

AimPrimary(heading, pitch)
{

if(!canfire)
return 0;

return 1;
}

不要这样做,会使武器卡住。改成这样:
AimPrimary(heading, pitch)
{

while(!canfire)
sleep 100;

return 1;
}

如果我没记错的话,凭借我N多年前的程序基础知识,!canfire的意思是“非canfire”吧??

[

狐狸,你之前说的计数器是怎么回事?

计数器就是弹夹容量

楼上能说具体点吗?

[

一个全局的static-var啊。。。
你可以用它来记录一些数值。。。比如说你弹夹内剩余子弹数量之类的。。。