要用X-Plane进行二次开发,免不了需要进行参数的传递,下面我们来看看与X-Plane进行数据交互都有哪些方式。
与FSX和Flightgear基本一样,X-Plane支持插件,自然也支持通过插件进行数据交互,另外还可以通过在UI界面直接设置将数据显示在主屏上(二次开发并不需要这种方式,下面不讨论),然后还支持通过UDP通过网络进行通信。实际上主要的就这几个,有一些第三方工具实际上在这三种方式基础上做了一些开发,但有时候更好用了。如NASA通过插件做了一个代理,即NASA写了个插件直接与X-Plane通信获取数据,同时该插件还通过UDP与外部程序通信,经过定制后的通信更加方便了,不需要再考虑X-Plane原生的UDP通信方式中数据对齐的问题了。下面就一一进行介绍。
一、X-Plane原生支持的通信方式
1、通过Plugin进行数据交互
在X-Plane插件开发中提供了DataRefs API(http://www.xsquawkbox.net/xpsdk/mediawiki/DataRefs)来允许Plugin读取或者与其他X-Plane Plugin交换数据数据。
在X-Plane中数据名称是一个很长的字符串,如:sim/flightmodel/position/latitude代表其对应的latitude。X-Plane中现有的变量可以从这个表中查到http://www.xsquawkbox.net/xpsdk/docs/DataRefs.html。
关于如何使用这个些变量具体在页面中并没有给出不过可以到下面这个页面下载最新的例程。
http://www.xsquawkbox.net/xpsdk/mediawiki/Category:Sample_Code 其中SDK 2.1 Sample Code例SDK210Tests这个例程,其中就有相关用法。如下:
1 // Datarefs to get the aicraft position 2 SDK210Tests_refx = XPLMFindDataRef("sim/flightmodel/position/local_x"); 3 SDK210Tests_refy = XPLMFindDataRef("sim/flightmodel/position/local_y"); 4 SDK210Tests_refz = XPLMFindDataRef("sim/flightmodel/position/local_z");
另外要实际使用的时,相应的详细说明查阅www.xsquawkbox.net/xpsdk/mediawiki/XPLMDataAccess的API文档即可。
通过X-Plane插件进行数据交互好处是容易写,无需考虑字节对齐问题。但不好的一点是,plugin代码是和X-Plane主程序一起运行的,X-Plane的每一帧都会去调用X-Plane Plugin的相关内容,一旦Plugin出错很有可能导致X-Plane崩溃,这是对要命的,要知道启动一次X-Plane需要至少3分钟,这还是配置比较高的电脑。。。。所以更好,更方便的是通过外部程序与X-Plane通信获取需要的数据。那就是下面这种方式。
2、通过UDP进行通信
不得不吐槽一下,对开发者来说,X-Plane的文档写的真是太随意,太乱了,而且很多重要的内容压根就没写。所以要找到一些文档还需要自己去搜罗,比如,X-Plane自带一个UDP通信的说明文档,在其安装目录XXXX\X