ColdFront 发表于 2008-6-22 20:53:44

微软模拟飞行课程中的脚本控制教程

微软模拟飞行课程中的脚本控制教程
作者:冷锋
    Microsoft Flight Simulator 游戏中的地面课程是飞友都接触过的,其课程中的飞行绝大部分是使用脚本来控制的飞行。这也是我在对Microsoft Flight Simulator 2004 进行汉化的过程中,经过不断摸索和学习,逐步领会到其中的一些奥妙和乐趣。相信你在看完本教程之后,也会对此感有兴趣,从而增加你对Microsoft Flight Simulator游戏的进一步了解,到达一个更广阔、更有趣味和挑战性的游戏境界中,甚至可以亲自动手编写出值得炫耀的模拟飞行教学课件。

    有相当一部分的飞友玩家,在开发游戏中的机模涂装、机场地景,编辑和翻译教程等诸多方面做出了著有成效可喜成绩,通过网络分享,使爱好模拟飞行的广大网友受益非浅,仅此向这些无私奉献的飞鸟们致以崇高的敬意!

    鉴于众多的玩家比较注重于模拟飞行游戏中的操作技巧,忽略了开发者在游戏中使用的各种技术手段,本人在此班门弄斧,编写出这个专题教程,希望能达到抛砖引玉,和玩家们相互交流和学习的目的效果。

上篇 脚本控制飞行基础知识
关于游戏中的脚本

    最典型的例子是Microsoft Flight Simulator 地面飞行学校的飞行课程,使用了脚本(Script)进行飞行的控制,细心的玩家可能已发现游戏中有个"Script"文件夹,不错,这个文件夹中的ABL文件就是一些特殊的脚本(Script)文件,他们在游戏中是一种公用的模块,由某个飞行的具体控制脚本(与飞行文件FLT文件同在一起并且文件名相同)的ABL文件进行调用。例如:地面飞行学校课程中的私人飞行员课程中的第四课:机场航线 ,这个飞行课程在"Microsoft Games\Flight Simulator 9\Lessons\priv"文件夹中有三个文件:

A. Lesson 4.FLT (飞行初始化文件,它将调入以下的 B. C.两个文件)
B. Lesson 4.ABL (飞行控制脚本,它将调入上述"Script"文件夹夹中的几个个公用ABL 文件)
C. Lesson 4.WX (飞行气象配置文件)

    当你在飞行这个课程中的机场航线时,游戏将会使用这三个文件,其中Lesson 4.ABL 将控制你的飞行活动。

什么是脚本(Script)

    脚本简单地说就是一条条的文字命令,这些文字命令是我们可以看到的(如可以用记事本打开查看、编辑),脚本程序在执行时,是由系统的一个解释器,将其一条条的翻译成机器可识别的指令,并按程序顺序执行。

    动态程序一般有两种实现方式,一是二进制方式,一是脚本方式。

    二进制方式是先将我们编写的程序进行编译,变成机器可识别的指令代码(如.exe文件),然后再执行。这种编译好的程序我们只能执行、使用,却看不到他的程序内容。

    脚本方式是程序在执行时,由系统的一个解释器,将其一条条的翻译成机器可识别的指令,并按程序顺序执行。

    脚本同我们平时使用的VB、C语言的区别主要是:脚本语法比较简单,比较容易掌握;脚本与应用程序密切相关,所以包括相对应用程序自身的功能;脚本就是源程序,就是代码程序。

飞行控制脚本

    Microsoft Flight Simulator中飞行控制脚本是一个以ABL为扩展名的文本文件,它主要包含了对飞行中的每一事件的控制命令,一旦游戏执行程序载入一个飞行文件(扩展名为FLT)之后,控制权将由飞行脚本中命令来执行。脚本命令有一定的格式和时序,一个飞行脚本的大致格式为:

1. 申明模组(Module)名称。比如是一个飞行的主题,命令格式举例如下:

module Script Flight;

2. 定义常量。引入一些公用脚本模块和指定飞行中的标准参量值。

    公用脚本模块是预先编制好的脚本,它们包含了对不同单位制之间的数学转换、事件名称的定义、驾舱操作工具的定义、地磁与航向角度之间的计算以及航路点经纬度的定义等等;飞行标准参量值包含高度、航向、空速以及通讯和导航频率的定量值或者逻辑值等,是衡量飞行活动中的标准。

3. 初始进程(可选部分)。用以在飞行前的十秒钟等待,以便用文本和/或语音对这个飞行进行介绍。
命令格式举例如下:

function Init; (初始进程函数)
code
Writeln ("Finished with Init");(写入初始进程的片段)
#include "script\lib\STDInit"; (引入初始进程的公用脚本模块)
fnMsg(normal,"脚本飞行演示"); (在屏幕上显示文本)
fnSQ_Play("prompt");(播放一个名为"prompt.wav"的声音文件)
Comm1 = acMe.ComRadio(1); (无线通讯频段位置)
bCrashCheck   = FALSE; (不检查坠落情况。当然,你尚在地面呀)
bParkingBrakeTarget = ON; (停机刹位置标准:设置。如果此时释放停机刹则警告)
endfunction; (结束函数)

4. 开始事件表达式。飞行控制的绝大部分命令将用来写在这个表达式的集合中,也就是说表达式中是飞行控制的主要体。命令语句如下:

switch (nState)
#include "script\lib\STDCases.abl"; (引入事件公用脚本模块)

5. 事件及控制命令。申明某一事件及事件命令集。例如一个推出动作:

[ 本帖最后由 zslj 于 2008-6-24 23:05 编辑 ]

ColdFront 发表于 2008-6-22 20:57:05

case CaseTaxi1: (事件名称,如滑行1)
writeln(\"CaseTaxi1\");(写入这个事件)
fnThrottle_Manual; (用户手动油门)
bParkingBrakeTarget = OFF; (停机刹位置标准:释放,此时用户可以松刹车了)
bParkingBrakeCheck= TRUE; (检查停车刹,如果不松刹车则出现警告)
bHeadingCheck   = FALSE; (不检查航向)
bThrottleCheck   = FALSE; (不检查油门)
bRollCheck= FALSE; (不检查横滚,及副翼片动作)
if (nIASNow > 5) then(条件:如果滑行速度大于5节,及机身已动)
   fnSQ_ChangeState(CaseTaxi1_1); (转换到指定的事件\"CaseTaxi1_1\")
   fnSQ_Synchronize; (同步:及将本事件中命令植入下一个事件中)
endif; (结束条件)
endcase; (结束本事件)

为了加强说明,再举例接下来的几个滑行事件,直至进入起飞跑道中:

case CaseTaxi1_1: (事件名称,如滑行1_1)
writeln(\"CaseTaxi1_1\");(写入这个事件)
if (AP.Master) then (条件:如果自动驾驶仪主开关打开)
AP.Master = FALSE; (自动驾驶仪主开关置关闭位置)
endif; (结束条件)
nSpeedTarget= 20; (空速标准:20节)
fnTolerance(TF_SPEED,ON,0); (开始空速检查,警告声音打开)
if (not bWOW) then(条件:如果机轮离地)
   fnSQ_NormalMsg(\"你未获准起飞的许可,这是严重的错误 !!! 现在结束课程 ...\",0); (在屏幕上显示一个警告文本)
   fnSQ_Pause(10); (暂停十秒钟再往下执行脚本)
   fnSQ_ChangeState(CasePostFlight); (转换到结束事件中)
   fnSQ_Synchronize; (同步:将命令植入下一个事件中)
endif; (结束条件)
if (nIASNow > 0) and (nIASNow <= 25) then(条件:如果当前空速在25节及以下)
   bSpeedCheck = FALSE; (不检查空速)
endif; (结束条件)
if (nIASNow >= 50) then(条件:如果当前空速等于或大于50节)
   bSpeedCheck = FALSE; (不检查速度检查,因前面开速度警告声音已打开,不断得警告声很烦人的)
   fnSQ_NormalMsg(\"你的滑行速度太高! ...\",0); (在屏幕上显示一个文本警告)
endif; (结束条件)
if (nIASNow > 5) then(条件:如果当前空速大于5节)
   fnSQ_NormalMsg(\"你正在滑行:维持大约 20 节速度跟随引导线滑行 ... 如果ATC窗口出现【1 -应答原地等待】时,应答后停下等待 ...\",0); (在屏幕上显示一个文本提示)
endif; (结束条件)
if (fnAtStop) then(条件:如果当前是停止)
   fnSQ_NormalMsg(\"你正在等待:如果ATC窗口出现【1 -应答继续滑行】时,应答后继续滑行 ... \",0); (在屏幕上显示一个文本提示)
endif; (结束条件)
if (nLat > 22.308) and (nLon < 113.9005) then(条件:如果到达北纬22.308以上和经度113.9005以下)
   fnSQ_NormalMsg(\"注意,前方已接近跑道的起飞入口位置,你需要减慢滑行速度以便在前方转弯 ...\",0); (在屏幕上显示一个文本提示)
   bSpeedCheck = FALSE; (不检查速度)

[ 本帖最后由 zslj 于 2008-6-24 16:52 编辑 ]

ColdFront 发表于 2008-6-22 21:00:08

   fnSQ_ChangeState(CaseTaxi1_2); (转换到滑行事件Taxi1_2)
   fnSQ_Synchronize; (同步:本事件中命令植入下一事件有效)
endif; (结束条件)
endcase; (结束本事件)

case CaseTaxi1_2: (事件名称,如滑行1_2)
writeln(\"CaseTaxi1_2\");(写入这个事件)
if (AP.Master) then (条件:如果自动驾驶仪主开关打开)
AP.Master = FALSE; (自动驾驶仪主开关置关闭位置)
endif; (结束条件)
if (nLat > 22.30861) and (nLon < 113.89866) then (条件:如果到达北纬22.30861以上和经度113.89866以下)
   fnSQ_NormalMsg(\"滑行至前面跑道旁的等待线停下来!\",0); (在屏幕上显示一个文本提示)
   fnSQ_Play(\"sound04\");(播放\"sound04.wav\"声音文件)
   fnSQ_ChangeState(CaseTaxi1_3); (转换到滑行事件Taxi1_3)
   fnSQ_Synchronize; (同步:本事件中命令植入下一事件有效)
endif; (结束条件)
endcase; (结束本事件)

case CaseTaxi1_3: (事件名称,如滑行1_3)
writeln(\"CaseTaxi1_3\");(写入这个事件)
if (AP.Master) then (条件:如果自动驾驶仪主开关打开)
AP.Master = FALSE; (自动驾驶仪主开关置关闭位置)
endif; (结束条件)
if (Diff (Comm1.Frequency,VHHHTower) < 0.001) then(条件:一旦塔台管制频率激活)
   Comm1.Frequency = VHHHGround; (将频率设置到地面管制,以限制用户使用塔台通话)
endif; (结束条件)
if (nLat < 22.30983) and (nLon < 113.89833) then (条件:如果到达北纬22.30983以下和经度113.89833以下)
   if (fnAtStop) then(嵌套条件:如果当前是停止)
    fnSQ_NormalMsg(\"你还未到达等待线的附近,必须在等待线的附近停下!\",0); (在屏幕上显示一个文本提示)
   endif; (结束嵌套条件)
endif; (结束条件)
if (nLat >= 22.30983) and (nLon < 113.89833) then(条件:如果到达北纬22.30983以上和经度113.89833以下)
   if (fnAtStop) then(嵌套条件:如果当前是停止)
    fnSQ_NormalMsg(\"接下来将进入到起落航线的飞行 ... 选项: 按 Ctrl + [ 键观看《起落航线演示》;按 Ctrl + ] 键跳过《起落航线演示》\",0); (提示用户选择选项组合按键)
    fnSQ_ChangeState(CaseTaxi1_4); (转换到滑行事件Taxi1_4)
    fnSQ_Synchronize; (同步:本事件中命令植入下一事件有效)
   endif; (结束嵌套条件)
endif; (结束条件)
endcase; (结束本事件)

case CaseTaxi1_4: (事件名称,如滑行1_4)
writeln(\"CaseCal1\");(写入这个事件)
if (Diff (Comm1.Frequency,VHHHTower) < 0.001) then(条件:一旦塔台管制频率激活)
Comm1.Frequency = VHHHGround; (将频率设置到地面管制,以限制用户使用塔台通话)
endif; (结束条件)

[ 本帖最后由 zslj 于 2008-6-24 16:58 编辑 ]

ColdFront 发表于 2008-6-22 21:00:56

if (bUserKey1) then(条件:如果用户按下了Ctrl + [ 键)
   fnSQ_NormalMsg(\"现在进入跑道,跟随滑行线右转弯到跑道的中央 ...\",0); (在屏幕上显示一个文本提示)
   bUserKey1 = FALSE; (清除用户当前的按键状态)
   nPoint=22.3137533; (维度标志点)
   nPoint= 113.9068333; (经度标志点)
   nPoint=22.3138133; (维度标志点)
   nPoint= 113.9068333; (经度标志点)
   nPoint=22.3107366; (维度标志点)
   nPoint= 113.897333; (经度标志点)
   nPoint=22.3106766; (维度标志点)
   nPoint= 113.897333; (经度标志点)
   (以上设置一个矩形经纬度范围,用来判断飞机是否进入)
   fnSQ_Pause(15); (等待15秒钟,以便用户把飞机驶进上面设置的范围)
   fnSQ_ChangeState(CaseCal2); (转换到事件Cal2)
   fnSQ_Synchronize; (同步:本事件中命令植入下一事件有效)
endif; (结束本事件)
if (bUserKey2) then(条件:如果用户按下了Ctrl + ] 键)
   bUserKey2 = FALSE; (清除用户当前的按键状态)
   fnSQ_ChangeState(CaseTaxi1_4); (转换到滑行事件Taxi1_4)
   fnSQ_Synchronize; (同步:本事件中命令植入下一事件有效)
endif; (结束条件)
endcase; (结束本事件)
...
...

6. 结束事件表达式。命令语句如下:

endswitch;

7. 显示显示游戏中的飞行分析。命令语句如下:

fnMsgDisplay;

8. 结束模组。命令语句如下:

endmodule.

至此,你已经了解了飞行脚本控制文件的大概,接下来我们看看具体的命令语句。

脚本命令

用于控制飞行的脚本命令按其功能作用可分为以下种类,并在此注以使用说明:

1) 闪示驾驶舱仪表及工具类命令

此类命令在驾驶舱仪表板上显示一个黄线框,以每秒一次的频率闪现,起到提示用户要注意的仪表或者操作的器具。
格式为:命令(\"仪表或器具名称\",闪现次数):

仪表类
fnSQ_GaugeHilight(\"Airspeed\",12); //空速表
fnSQ_GaugeHilight(\"Attitude\",6); //姿态仪
fnSQ_GaugeHilight(\"Altimeter\",6); //高度表
fnSQ_GaugeHilight(\"Turn_Indicator\",6); //转弯指示仪

[ 本帖最后由 zslj 于 2008-6-24 17:04 编辑 ]

ColdFront 发表于 2008-6-22 21:01:41

fnSQ_GaugeHilight(\"Heading_Indicator\",3); //航向指示仪
fnSQ_GaugeHilight(\"Vertical_Speed\",6); //垂直速度表
fnSQ_GaugeHilight(\"VOR1\",8); //VOR1表(下滑道)
fnSQ_GaugeHilight(\"VOR2\",8); //VOR2表(下滑道)
fnSQ_GaugeHilight(\"ADF\",8); //ADF导航指示表
fnSQ_GaugeHilight(\"Tachometer\",6); //转速表
fnSQ_GaugeHilight(\"RMI\",8);   //双针磁罗盘
fnSQ_GaugeHilight(\"HSI\",8); //水平状态指示仪

控制、显示类
fnSQ_GaugeHilight(\"Clock\",8); //时钟
fnSQ_GaugeHilight(\"DME\",8); //测距器
fnSQ_GaugeHilight(\"Flaps\",8); //襟翼刻度指示
fnSQ_GaugeHilight(\"Thrust_Controls\",6); //能量控制器 (油门、混合)
fnSQ_GaugeHilight(\"Pitch_Trim\",10); //坡度调协器

图标类
fnSQ_GaugeHilight(\"GPS Icon\",8);//GPS图标
fnSQ_GaugeHilight(\"Kneeboard Icon\",8); //膝板图标
fnSQ_GaugeHilight(\"MAP Icon\",8); //地图图标
fnSQ_GaugeHilight(\"ATC Icon\",8);//航空管制窗口图标

其它
fnSQ_GaugeHilight(\"Landing Lights\",8); //着陆灯开关
fnSQ_GaugeHilight(\"Main Set\",8); //主设置
fnSQ_GaugeHilight(\"Gear Lever\",8); //着陆架杆
fnSQ_GaugeHilight(\"Autobrake\",8);//自动刹车旋盘开关

2) 航路点及经纬度范围设置类命令

此类命令用于设置一个矩形的空间范围或者某一具体的航路点,要注意的是其经纬度采用的是100进位制。可以用四个点定义任意大小的一个矩形,如一条跑道;或者经纬度交汇上的一个点,如一个航路点;亦或用纬线(或经线)界定一条临界线。在自动驾驶仪使用状态下还可令飞机驶向任意已确定好的航路点上。

格式为:命令[标号,维度或者经度名] = 经纬度值;

nPoint = 47.92015; //标定第一个纬度值
nPoint = -122.2862; //标定第一个经度值
nPoint = 47.92015;//标定第二个纬度值
nPoint = -122.2855;//标定第二个经度值
nPoint = 47.89543; //标定第三个纬度值
nPoint = -122.2850; //标定第三个经度值
nPoint = 47.89543; //标定第四个纬度值
nPoint = -122.2856; //标定第四个经度值

   如果是机场者跑道,需要用到以上四组值来标定一个矩形范围,画矩形时的起始点可以自定,但各标号在矩形上不能乱序;如果要标定一个航路点,只需用到以上的其中一组,及一个经纬度交汇点即可;要标定一条临界线只需取以上的一条设置命令即可(纬度或者经度)。如下图所示:



飞向一个标定的航路点命令(在自动驾驶仪工作状态下):

nBearing = round(posHere.BearingTo(nPoint,nPoint)); (用经、纬度标定航路点)
nHeadingTarget = nBearing; (设置航向指示器中的游标到航路点方位)
AP.Heading = nHeadingTarget; (自动驾驶仪航向保持在航向指示器中的游标方位)

[ 本帖最后由 zslj 于 2008-6-25 21:26 编辑 ]

ColdFront 发表于 2008-6-22 21:02:19

3) 显示文本和播放声音类命令

    在任何时候,只要需要你都可以在屏幕上方显示任意的文本和播放指定的WAV声音文件。文本内容可以直接写在脚本命令语句中也可以在脚本之外调用,调用之前必须先申明外部文本文件的路径;声音文件必须是WAV格式,并统一放置在定义好的路径文件夹中。

调用外部文本文件的命令:
#include \"messages\\lib\\tolerances.msg\";
#include \"messages\\other\\intro1.msg\";

设置外部声音文件路径的命令:
strWavBase = \"Flights\\\\Pinouts\\\\sound\\\\\";   (注意路径符号是双斜杠)

显示文本命令:

注:信息可以是直接文本和外部源。
以下是三种信息的两种不同写法,直接在命令中写入文本的:

第一种写法:
fnMsg(Normal, \"正常信息,显示白色文字。\");
fnMsg(Warning, \"警告信息,显示黄色文字。\");
fnMsg(Error, \"错误信息,显示粉红色文字。\");

第二种写法:
fnNormalMsg(\"正常信息,显示白色文字。\",0);
fnWarningMsg(\"警告信息,显示黄色文字。\",0);
fnErrorMsg(\"错误信息,显示粉红色文字。\",0);

调用外部信息源的两种写法:
fnMsg(Normal, s1);(其中s1是外部信息文本文件中的某条文本的标号)
fnSQ_NormalMsg(s1,0); (其中s1是外部信息文本文件中的某条文本的标号)

播放声音命令:
fnSQ_Play(\"prompt\"); (其中prompt是外部声音文件的文件名称)

注意:正常信息级别最低,显示后,遇到下一条信息后即被替换;警告信息级别中等,持续显示;错误信息级别最高,持续显示。

4) 驾驶舱操作类命令

驾驶舱操作类命令可以让你控制如油门、升降舵、襟翼、起落架和熄灭引擎以及灯光和各种开关的操作。

cpoffice.NavGPSSwitch = 0;(导航开关置GPS位置,为1则Nav位置)
AP.Master = TRUE;(自动驾驶仪主开关打开,为FALSE 则关闭)
cpOffice.FlapsHandlePos = 3;(襟翼档位置,根据机型而定)
cpoffice.LandingLightsOn = ON;(着陆灯打开,OFF为关闭)
fnThrottle_Hold(0.21);(设置节流阀的百分比大小)
cpOffice.ElevatorTrim = 0.5;(设置升降舵配平位置)
AP.AutoBrake = OFF;(设置自动刹车旋盘的档位,根据机型而定)
fnThrottle_Manual;(允许用户手动控制油门)

5) 自动驾驶仪设置命令
20904
开关命令:
AP.Master = TRUE; (自动驾驶仪主开关打开,为FALSE 则关闭)
AP.ArmAutoThrottle = TRUE;(自动油门开关打开,为FALSE 则关闭)

[ 本帖最后由 zslj 于 2008-6-25 20:45 编辑 ]

ColdFront 发表于 2008-6-23 10:39:00

设置参数命令:
AP.Altitude = 10000; (设置高度参数)
AP.Airspeed = 250;(设置空速参数)
AP.Heading = 190;(设置航向参数)
AP.VerticalSpeed = 700; (垂直速率数值,下降为负值)

自动驾驶仪保持状态命令:
AP.AltitudeHold= TRUE;(高度保持,为FALSE 则取消)
AP.HeadingHold= TRUE;(航向保持,为FALSE 则取消)
AP.AirspeedHold = TRUE;(空速保持,为FALSE 则取消)
AP.WingLeveler= TRUE;(副翼居中,用于直线飞行,为FALSE 则取消)
AP.NavHold   = TRUE;(导航模式开,为FALSE 则取消)
AP.ApproachHold= TRUE;   (进近模式开,为FALSE 则取消)            
AP.GlideSlopeHold = TRUE; (下滑道维持模式开,为FALSE 则取消)

6) 通讯、导航设备参量设置类命令

此类命令帮助你设置通讯频率和导航数据。

Comm1.Frequency = 121.600; (设置Com1频率)
Comm2.Frequency = 118.20; (设置Com2频率)
VHFNAV1.Frequency = 111.1;(设置NAV1频率)
VHFNAV2.Frequency = 120.8;(设置NAV2频率)
VHFNAV1.StandbyFrequency = 109.3;(设置NAV1备用频率)
VHFNAV2.StandbyFrequency = 109.3;(设置NAV2备用频率)
ADF1.Frequency = 390.0;(设置ADF频率)
VHFNAV1.OBS = 180;(设置OBS1位置)
VHFNAV2.OBS = 220;(设置OBS2位置)

7) 有关航路误差检测的命令

此类命令用以测定当前的航点位置误差。

if (cpoffice.marker == 1) then (如果已通过外指点标)
if (VHFNav1.ToFrom == defToFromFrom) then (如果VHFNav1 接收信号为离开)
if (vorSelect.ToFrom == defToFromTo) then (如果 VOR TO/FROM 指示为到达)
if (abs(nLocalizer) > 4) (如果当前航道偏离台站大于4 刻度)
if (abs(diff(nYaw, 100)) > 5) (如果当前的航向大于105度)
if (nDMEDistance <= 40) (如果距离台站小于40海里)
if (nGlideSlope <> 0) then(如果已截获到下滑道)
if (abs(nGlideSlope) > 0.5)(如果当前位置偏离下滑道大于0.5刻度)
if (abs(Diff360(nYaw,nHeadingTarget)) <= 2)(如果当前当前航向与预设的航向标相差小于2度)

8) 有关标准值设定和检查开关命令

此类命令可以用来制定和检查飞行标准的参量。

设定参量值命令:
nAltitudeTarget    = 2000; (设置高度标准值)
nAltitudeToleranceMax = 100; (相对高度标准允许的上限值)

[ 本帖最后由 zslj 于 2008-6-24 17:23 编辑 ]

ColdFront 发表于 2008-6-23 10:39:53

nAltitudeToleranceMin = -100; (相对高度标准允许的下限值)
nHeadingTarget   = 070; (设置航向标准值)
nHeadingToleranceMax = 10; (相对航向标准允许的上限值)
nHeadingToleranceMin = -10; (相对航向标准允许的下限值)
nSpeedTarget    = 95; (设置速度标准值)
nSpeedToleranceMax   = 10; (相对速度标准允许的上限值)
nSpeedToleranceMin   = -10; (相对速度标准允许的下限值)
nPitchTarget    = 10;(设置坡度标准值)
nPitchToleranceMax   = 5; (相对坡度标准允许的上限值)
nPitchToleranceMin   = -5; (相对坡度标准允许的下限值)
nThrottleTarget    = 0;(设置油门标准值)
nThrottleToleranceMax = 0.1; (相对油门标准允许的上限值)
nThrottleToleranceMin= -0.1; (相对油门标准允许的下限值)
nRPMTarget    = 2400;(设置转速标准值)
nRPMToleranceMax= 100;(相对转速标准允许的上限值)
nRPMToleranceMin= -100; (相对转速标准允许的下限值)
nRollTarget   = 0;(设置横滚岸度标准值)
nRollToleranceMax= 5;(相对横滚岸度标准允许的上限值)
nRollToleranceMin= -5;(相对横滚岸度标准允许的下限值)
nLocalizerTolerance= 0.3; (偏离台站宽容值)
nGlideSlopeTolerance= 0.4; (偏离下滑道宽容值)
nFlaps737Target   = 3; (襟翼刻度档位置)
bLandingLightsTarget= ON; (着陆灯开关开位置)
bParkingBrakeTarget= ON; (停机刹设置位置)

参量值检查开关命令:
bAltitudeCheck= TRUE; (高度检查,FALSE 为不检查)
bSpeedCheck= TRUE; (速度检查,FALSE 为不检查)
bHeadingCheck= TRUE; (航向检查,FALSE 为不检查)
bHeadingCheck= TRUE; (航向检查,FALSE 为不检查)
bFlapsCheck= FALSE; (襟翼检查,FALSE 为不检查)
bRPMCheck   = TRUE; (转速检查,FALSE 为不检查)
bCrashCheck   = TRUE; (坠毁检查,FALSE 为不检查)
bLocalizerCheck= TRUE; (航道检查,FALSE 为不检查)
bGlideSlopeCheck= TRUE; (下滑道检查,FALSE 为不检查)
bParkingBrakeCheck= TRUE; (停机刹检查,FALSE 为不检查)

以上各类脚本命令只是枚举了其中的一部分,旨在让你认识脚本命令。在你创建自己的飞行脚本时,可根据飞行操控要求参阅:游戏文件夹 \"Microsoft Games\\Flight Simulator 9\\Lessons\" 中各地面飞行课程中的脚本文件。

[ 本帖最后由 zslj 于 2008-6-24 17:27 编辑 ]

fdl 发表于 2008-6-23 13:37:22


太棒了!!!

ColdFront 发表于 2008-6-24 17:43:11

下篇 脚本控制飞行的制作
准备工作
一个脚本控制飞行的制作准备内容包括以下方面:
◆ 新建一个用于飞行的文件夹
    这个文件夹可以放在硬盘的任何位置,但是我建议把它放在模拟飞行游戏中的\"Microsoft Games\\Flight Simulator 9\\Flights\"文件夹下面。这是游戏默认的飞行选择文件夹,点击游戏主屏幕上的\"选择一个飞行\",游戏将自动搜索该文件夹下面的所有飞行文件。文件夹名称可以自定,比如\"Script Flight\"(以下内容将以此名称为例)

◆准备你的飞行文件
    这一步可以让你设置飞行活动的初始化状态,例如;出发地点(可以是某机场及跑到或停机位,也可以是在巡航或进近的空中状态)、时间、天气,选择飞机的种类和型号。

a)启动模拟飞行游戏(在此FS9为例);

b)在主屏幕上选择\"创建一个飞行\";

c)选择好飞机、机场、跑道或停机位、设置好时间和天气;

d)点击\"现在飞\"进入游戏窗口;

e)如果已看到你的飞机和机场环境,觉得满意就保存这个飞行。

f)在游戏菜单中保存这个飞行(默认保存的位置是在\"我的文档\"中),填写好保存名称和介绍内容。比如名称为\"Script Flight\"(为了方便说明,以下均以此名称为例)

g)从\"我的文档\"文件夹中的\"Flight Simulator Files\"文件夹中找到你刚保存的飞行文件,因该有两个文件:\"Script Flight .FLT\"和\"Script Flight.WX\"。将它们复制到\"Script Flight\"文件夹中。

◆新建一个脚本(ABL)文件

    最简单的方法是从模拟飞行地面飞行课程(Microsoft Games\\Flight Simulator 9\\Lessons)中选择一个与你飞机种类大致相同的ABL文件,同样复制到\"Script Flight\"文件夹中。因为ABL文件中的一部分内容是根据不同的机种(比如引擎数量、螺旋桨与喷气式飞机)来初始化飞机参数的。然后将拷贝的文件进行重新命名,建议命名为\"Script Flight.ABL\"

◆把你的飞行文件和脚本(ABL)文件联系起来

    用文本编辑器(比如Uedit32 等)打开\"Script Flight .FLT\"这个飞行文件,建议不要用windows自带的记事本,对十六进制字符处理不好,容易使ABL文件出错。
在\"Script Flight .FLT\"文件的头部找到\"\"这个块部分;
在\"Title=\"后面写上一个标题(它将在游戏中的\"选择飞行(H)\"一栏中出现);
在\"Description=\"后面写上飞行的描述(它将在游戏中的\"飞行描述(D)\"一栏中出现);
在 块部分的结尾加上一行:ablscript=\"Script Flight\" (这是调入脚本文件的关键,此处不要带文件的扩展名);
保存\"Script Flight .FLT\"文件。

    好了,现在我们已经把飞行文件和脚本文件联系在一起了。值得注意的是飞行文件\"Script Flight .FLT\"、天气文件\"Script Flight.WX\"和脚本文件\"Script Flight .ABL\"的文件名现在是相同的,其中只允许脚本文件\"Script Flight .ABL\"可以是不同,但必须在飞行文件\"Script Flight .FLT\"中的\"ablscript=\"一行申明脚本文件的名称。

◆组织你的音效和语音文件(可选)

    为了丰富在飞行活动中的娱乐性,你可以录制自己的和搜集现有的音乐、效果声音和语音,但必须是WAV格式的文件,将它们放在一个文件夹中(例如在\"Script Flight\"文件夹中新建一个\"Sound\"子文件夹),以便在脚本中用播放命令来调用它们。

编写脚本文件Script Flight .ABL

    用文本编辑器(比如Uedit32 等)打开Script Flight .ABL 文件进行编辑,在这里是发挥你无限想象力的空间,它可以帮助你完成绝大部份的飞行活动。首先理清你的思路来修改和编写你拷贝的Script Flight .ABL 文件内容。检查Script Flight .ABL 文件开始部分有关飞机参数的部分是不是和你当前的飞机相适应,然后根据你组织的飞行活动来有条不紊的编写各种命令脚本。

    在 Script Flight .ABL 文件中你自己创建所有控制命令语句必须符合和依赖微软游戏中的公用脚本模组(他们在\"Microsoft Games\\Flight Simulator 9\\Script\\lib\"文件夹中)的支持和解释给游戏程序。所以在Script Flight .ABL 文件中调用了他们,例如:

#include \"script\\lib\\STDKonstants.abl\"; (全局常量)
#include \"messages\\student\\lesson 1.msg\"; (调用外部文本信息文件,与本次飞行相关)
#include \"messages\\lib\\tolerances.msg\"; (调用外部文本信息文件,允许误差检查相关)
#include \"script\\lib\\STDVars.abl\"; (全程变量)
#include \"script\\lib\\StringFns.abl\"; (字符串函数)
#include \"script\\lib\\Messages.abl\"; (文字信息处理)
#include \"script\\lib\\Math.abl\"; (数学处理函数)
#include \"script\\lib\\Throttle.abl\"; (供油函数)
#include \"script\\lib\\SimQueue.abl\"; (声音和文本线程处理)
#include \"script\\lib\\stdChkTolerances.abl\"; (检查各项公差标准)

[ 本帖最后由 zslj 于 2008-6-24 17:44 编辑 ]
页: [1]
查看完整版本: 微软模拟飞行课程中的脚本控制教程