模拟飞行游戏的另一种玩法——《用脚本操控的飞行》

相信玩过微软模拟飞行的飞友一定都飞过游戏里面的地面学校中的课程。是否惊奇在飞行中尤如教练就在你的身旁指导,有时甚至帮助你来控制飞机呢?其实,微软模拟飞行游戏组的工程师们在这些飞行课程中都是利用了一种脚本文件(*.abl)来控制整个飞行的。当你打开“Microsoft Games\Flight Simulator 9\Lessons”中每个课程的子文件夹就会发现几乎每个飞行都包含有“XXXXX.FLT”、“XXXXX.ABL”、“XXXXX.WX”三个文件,其中“XXXXX.FLT”是飞行基本配置的飞行引导文件,“XXXXX.ABL”是飞行控制的脚本文件,“XXXXX.WX”是飞行的气象配置文件。其中“XXXXX.ABL”文件就是我们这里要学习的文件。这个文件只是一个文本文件,用记事本就可以来编辑它。

既然如此,那么你同样也可以利用自己的“XXXXX.ABL”文件让飞机飞到你的家门口,载上老婆、孩子到天空中浪漫一回,信不信由你,看完了本帖,你将知道除了键盘和操纵杆之外,用脚本文字的命令也能开飞机!

下面就以微软模拟飞行FS9为环境(FSX同样完全继承了FS9中地面学校的全部飞行课程)教你如何创建一个“XXXXX.ABL”脚本文件来控制飞行。

一、[B]一个脚本文件控制的飞行飞行需要那些文件,如何创建[/B]?

在微软模拟飞行中最基本的是“XXXXX.FLT”和“XXXXX.WX”两个文件,它们可以由在游戏中的“保存飞行”功能所得到。其中“XXXXX.FLT”文件定义了你飞行的起始位置、飞机型号、航向等等基本元素的配置,“XXXXX.WX”文件是你保存游戏时的气候环境,除了扩展名不一样,它们的文件名是完全相同的。有了这两个文件,你就能在游戏中利用键盘和摇杆来驾驶飞机了。你可以将“XXXXX.FLT”文件用鼠标将它拖到桌面上的模拟飞行游戏快捷图标上来启动游戏开始这个飞行。

如果你制定了飞行计划,在保存时会多出一个“XXXXX.PLN”文件,它包含了你的飞行计划中的航路点信息等,此文件不在我们的学习范围之类。

如果要像游戏中地面课程那样,按照自己的意愿来控制飞行活动,那么就需要动手创建一个XXXXX.ABL”文件了(以下称ABL文件)。

为了丰富飞行活动,还可以添加文字提示内容“XXXXX.msg”文件和声音“XXXXX.wav”文件。

二、[B]什么是ABL文件,有什么作用[/B]?

ABL文件是一个文本命令文件,也称“脚本”,把它理解成剧本即可。飞行一旦开始,它有XXXXX.FLT”飞行文件来加载到游戏中,飞行过程中游戏将按照ABL文件中的命令执行并完成飞行的活动。

ABL文件的命令可以完成飞行中的绝大部分飞机活动,以及会话和声音行为,例如:抬升、加减油门、收放襟翼、改变航向、飞到某一定义的航路点、熄灭引擎等。

此外,ABL文件还可以判断飞机的空间位置(经纬度、高度)和速度,并能判别ATC的频率。可以显示文字和启动声音以及工具仪表的提示。

有了这些功能,我们就可以设计并控制一个飞行了(像微软游戏开发组的工程师那样)。

三、[B]介绍ABL文件的脚本命令语句[/B]

仪表工具闪示命令:在游戏界面以黄色框线在驾舱的某个仪表或者工具上进行闪示,以指示某个仪表。
fnSQ_GaugeHilight("Airspeed",12); //空速表闪12次
fnSQ_GaugeHilight("Attitude",8); //姿态仪闪8次
fnSQ_GaugeHilight("Altimeter",5); //高度表闪5次

塞斯纳飞机的仪表名称:
Turn_Indicator //转弯指示仪
Heading_Indicator //航向指示仪
Vertical_Speed //垂直速度表
VOR1 //VOR1表
VOR2 //VOR2表
ADF //ADF表
Tachometer //转速表
Clock //时钟
DME //测距器
Flaps //襟翼刻度
Thrust_Controls //能量控制器 (油门)
Pitch_Trim //坡度调协器
GPS Icon //GPS图标按钮
Kneeboard Icon //膝板图标按钮
MAP Icon //地图图标按钮
ATC Icon //ATC图标按钮

其它机型(如波音机等)的仪表名称:
Landing Lights //着陆灯
Main Set //主设置
Gear Lever //着陆架杆
Autobrake //自动刹车
RMI //双针磁罗盘
HSI //水平状态指示仪

控制类命令:用来执行飞机驾舱操作或飞行控制的命令。例如:
fnThrottle_Shutdown; //关闭油门
fnThrottle_HoldRPM(2400); //设置油门维持引擎转速2400转
fnThrottle_Hold(1.0); //油门百分百
bEngineFailure = FALSE; //防止引擎死火
bRPMProp = TRUE; //维持 RPM 公差的螺旋桨声音
cpoffice.NavGPSSwitch = 1; //设置 GPS 开关打开
cpoffice.NavGPSSwitch = 0; //设置 Nav 开关打开
cpOffice.FlapsHandlePos = 0; //设置襟翼完全收回
cpOffice.FlapsHandlePos = 3; //设置襟翼位置(跟据机型而定)
cpOffice.ElevatorTrim = 0.35; //设置升降舵配平位置

通讯、导航类命令:设定无线电通讯和导航频率以及导航仪表的游标。例如:
Comm1.Frequency = 121.6; //设置通讯1 频率(地面、塔台、服务)
Comm1.StandbyFrequency = 124.85; //设置通讯1 备用频率(地面、塔台、服务)
Comm2.Frequency = 118.4; //设置通讯2 频率(地面、塔台、服务)
Comm2.StandbyFrequency = 118.2; //设置通讯2 备用频率(地面、塔台、服务)
VHFNAV1.Frequency = 111.1; //设置 OVR1 导航接收频率
VHFNAV1.StandbyFrequency = 109.3; //设置 OVR1 导航接收备用频率
VHFNAV2.Frequency = 111.1; //设置 OVR2 导航接收频率
VHFNAV2.StandbyFrequency = 109.3; //设置 OVR2 导航接收备用频率
VHFNAV1.OBS = 130; //设置 OBS 表航道
nOBS1Target = 160; //设置 OBS1 表的游标

自动驾驶类命令:设置指定驾驶仪参量,执行自动驾驶。例如
AP.Master = TRUE; //打开自动驾驶仪
AP.ArmAutoThrottle = TRUE; //自动油门预位打开
AP.Heading = 290; //预置航道
AP.Altitude = 8000; //预置高度
AP.Airspeed = 250; //预置空速
AP.AltitudeHold = TRUE; //保持高度
AP.HeadingHold = TRUE; //保持航道
AP.AirspeedHold = TRUE; //保持空速

提示文字显示和播放声音命令:显示一个文本或播放一个声音。如:
fnSQ_NormalMsg(s6,0);; //显示标号为“s6”的文本
fnSQ_Play("sound04"); //播放文件名为“sound04.wav”的声音

以上摘录了部分命令以便大家熟悉,更多命令语句的发现和应用可以用记事本打开模拟飞行地面课程中的ABL文件来参考。

四、[B]ABL文件的内容组成[/B]

ABL文件是一个嵌套式结构。顶层是模块(module)一个飞行活动都包括在一个模块中;其次是事件的触发开关(switch),所有相关发生的事件包含在一个开关中;大量的事件(case)包含了执行该事件的不同命令。

ABL文件主要由以下的部分:

(1)引入相关脚本命令的解释文件(脚本命令的解释文件均在“Microsoft Games\Flight Simulator 9\Script\lib”文件夹中,游戏会自动调入这个路径,你不用去管它们)。初始化飞机的参量和设置飞行中正常飞行所允许的标准范围值。

(2)定义和执行一个飞行事件,下面是用两个事件来完成飞机的转弯飞行:

switch (nState) //事件出发开关
... ...
case CaseTurn1: //声明转弯飞行事件之一开始
writeln("CaseTurn1"); //写入事件一
fnSQ_NormalMsg("以 20°度坡度左转到到航向 343",0); //显示提示文本
fnSQ_GaugeHilight("Heading_Indicator",5); //在仪表板闪示航向指示器5下
nHeadingTarget = 343; //设置航道标准为343度航道
AP.Heading = 343; //设置航向指示器上的游标到343度航道
bThrottleCheck = FALSE; //不检查油门大小(以便你控制油门)
bHeadingCheck = FALSE; //不检查航向(因为你要转弯了)
fnSQ_Play("sound09"); //播放声音sound09
nTimer = 0; //重置计时器为0(从0开始重新计时)
fnSQ_ChangeState(CaseTurn1_1); //跳到跳到事件“CaseTurn1_1”
fnSQ_Synchronize; //将命令往下一个事件继承下去
endcase; //声明事件结束

case CaseTurn1_1: //声明转弯飞行事件之二开始
Writeln ("CaseTurn1_1"); //写入事件二
if (AP.Master) then //如果在自动驾驶状态
AP.Master = FALSE; //取消自动驾驶仪
endif; //结束如果
if (nTimer > 20) and (not bHeadingCheck) then //如果计时超过20秒和无航向检查,则
bHeadingCheck = TRUE; //开始检查航向(这时你应该已经转弯到了343度航道)
bWithinTolerance = TRUE; //开始标准范围量的检查
fnSQ_GaugeHilight("Tachometer",8); //在仪表板闪示转速表8下
fnSQ_NormalMsg("观察仪表板右下角的转速计,减少油门至每分钟 2,200 转",0); //显示文本
fnSQ_Play("sound07"); //播放声音sound07.wav文件声音
nRPMTarget = 2200; //设定当前螺旋桨转速为2200转/分
fnSQ_NormalMsg("你当前在侧风航程上飞行 ... ",0); //显示文本
fnSQ_Play("sound12"); //播放声音sound12.wav文件声音
fnSQ_ChangeState(CaseClimb2); //跳到跳到事件“CaseClimb2”(接下来应该是继续爬升的事件)
fnSQ_Synchronize; //将命令往下一个事件继承下去
endif; //结束如果
endcase; //声明事件结束

“转弯飞行事件之一”中的命令设为你设置了转向的航向以及提醒你进行转弯,并不检查你在转弯过程中的航向和油门。

“转弯飞行事件之二”中的命令给你20秒时间完成转弯,然后开始检查你的航向,并要求你的螺旋桨转速是2200转/分。告诉你飞到了起落航线的侧风边了。

ABL文件中的飞行活动都是通过一系列的事件来完成的,事件中的命令用来保证事件的发生和进行,同一类的大量事件放在一个事件触发开关(switch)语句对之中。

(3)结束飞行活动
case CaseRollout_5: //声明事件开始
writeln("CaseRollout_5"); //写入事件
fnSQ_NormalMsg("你已经成功地完成了本课程! 要重新开始本课程 Ctrl + ; 键; 要结束课程按 Ctrl + ] 键",0); //显示文本
fnSQ_Play("sound19"); //播放声音sound19.wav文件声音
fnSQ_ChangeState(caseWaitForUserKey2); //等待用户的按下“]”键
bUserKey2 = FALSE; //设置用户键是未按下状态
fnSQ_ChangeState(CasePostFlight); //跳到跳到事件“CasePostFlight”
fnSQ_Synchronize; //将命令往下一个事件继承下去
endcase; //声明事件结束

case CasePostFlight: //声明事件开始
writeln("CasePostFlight"); //写入事件
fnClearMsg; //清除所有的显示文本事件
fnThrottle_Manual; //撤销油门设置命令,允许手控油门
fnSQ_ChangeState(CaseEnd); //跳到跳到事件“CaseEnd”(CaseEnd事件是一个内部执行事件)
fnSQ_Synchronize; //将命令往下一个事件继承下去
endcase; //声明事件结束
... ...
endswitch; //声明事件触发开关

综上所示,ABL文件是一个层次和结构分明的命令执行流程文件,非常容易理解。

五、[B]创建一个ABL文件控制飞行的步骤[/B]

(一)启动FS9游戏,设定你的飞行在那里开始,并设置你理想的天气环境,如果还想制定飞行计划也可以,完成后保存游戏(游戏默认的保存位置是:“Documents and Settings\用户名\MyDocuments\Flight Simulator Files”文件夹)。

(二)跟据你的机型参照地面飞行课程中相应机种的ABL文件复制到“\Documents and Settings\用户名\My Documents\Flight Simulator Files”文件夹中,并重新命名文件(一般和你保存飞行的文件名相同),接着从这个ABL文件中的“function Init;”语句(飞行开始部分)以下开始按照你的设想来修改。

(三)将你保存的“XXXXX.FLT”文件开头的 [Main] 部分的最后加上一行:
ablscript="XXXXX" //这一句表示引入你的脚本命令文件,"XXXXX"为你脚本命令文件的文件名(不要帶扩展名)

(四)ABL文件编辑完成后就可以测试飞行了,在游戏中选择你保存的飞行或者直接在“Documents and Settings\用户名\My Documents\Flight Simulator Files”文件夹中将你保存的“XXXXX.FLT”文件拖到桌面上FS9游戏的快捷图标上运行。

(五)ABL文件需要不断地进行调试和修改,以便尽量发挥你的想象力来构建你的飞行活动。

六、[B]编辑ABL文件的技巧和注意事项[/B]:

如果你不想应用地面飞行可从中的文本信息文件,即“XXXXX.msg”文件中的内容,可以直接在显示文本命令语句中填入想要显示的文字,例如:
将“fnSQ_NormalMsg(s7a,0);”改写为:
“fnSQ_NormalMsg("欢迎来到香港大屿岛国际机场(VHHH)",0);”
如果你想要指定声音文件的位置(默认位置是“Microsoft Games\Flight Simulator 9\Sound\lessons”),可以在ABL文件的“function Init;”和“endfunction;”部分之中插入“strWavBase = "Flights\\Pinouts\\sound\\";”(以“\\”为路径中的层级,可为帶盘符的绝对路径)。

ABL文件中命令语句前面帶“#”符号的必需独占一行。

重要提示:如果你编辑的ABL文件是放在“\Documents and Settings\用户名\My Documents\Flight Simulator Files”文件夹中进行的,保存游戏时将会改写这个文件为0字节的。

七、[B]编辑ABL文件需要参考的游戏原始文件[/B]

各种命令语句参考:“Microsoft Games\Flight Simulator 9\Lessons”文件夹中各个课程的ABL文件。

事件定义的名称参考:“Microsoft Games\Flight Simulator 9\Script\lib”文件夹中的“stdkonstants.abl”文件。

参考我编写的课程。

我晕死,可以拿它来排

我晕死,可以拿它来排电影啦.

lengfeng 的头像

嘻嘻

本文也复制到了《中国飞行模拟组织论坛》,并有你的网站链接,意向是招引更多的网友关注这里。
该不会怪我吧。

lengfeng 的头像

嘻嘻

本文也复制到了《中国飞行模拟组织论坛》,并有你的连接,以致招引更多网友。
该不会怪我吧。

lengfeng 的头像

有兴趣

感觉还是蛮好玩的,就像学习做论坛的感觉一样。

fsgamer 的头像

靠,这个我没见过别

靠,这个我没见过别的网站有说到,我觉得这个高级功能可以用于详细的演示飞行模拟的操作,或者编写视频教程。

等安装了fs9到笔记本上之后试试看,不过写脚本要仔细看。

信念不重选择,贵在坚持。
博客 Chenxinhe.com