Palomino值得一提的他的架构,非常灵活,场景的控制用的是lua脚本,其他的开发人员可以以自己的方式编写lua脚本,组建不一样的场景,而不用修改很多c++的代码;当然也是比较难以掌握的,特别是要调用c++写的函数必须要了解每个函数的用处和用法,同时要熟练掌握lua脚本。
(源码地址:
1.1 场景简介
l 海面、天空:整个程序的情景是大海中的航母,及起飞的飞机,敌方导弹等。主要的背景是大海和天空。有涌动的海面、飘着白云的天空。
图 4_x005f_x001e_1初始画面
l 飞机:飞行中的飞机可以通过0-9键控制飞机的速度,通过上下左右键控制飞机飞行的方向和高低
图 4_x005f_x001e_2飞行并锁定任务的飞机
l 向目标发射导弹,我们可以看到导弹飞行的粒子效果
图 4_x005f_x001e_3 攻击目标
l 飞机坠毁效果,可以按Backspace键重新开始游戏
图 //代码效果参考:http://hnjlyzjd.com/hw/wz_23997.html
4_x005f_x001e_4 坠毁的飞机1.2 程序结构
? 本模拟程序是基于OSG游戏引擎。在该引擎中添加了模型、粒子系统、键盘监听和模型轨迹控制等部分。工程代码的结构如下图所示:
图 4_x005f_x001e_5 工程结构图
1.2.1 程序的架构
场景的布置,任务的管理还有游戏的逻辑都是用脚本来完成的。
C++:
· simulator core
Lua:
· scene construction
· keyboard handling
· missions
· updating HUD
1.2.2 各lua脚本简介如下
? Actors.lua脚本内容分析
下面是几个物体相关的类的定义和实现:
1. -- Actor class –
这个类也就提供了一些基本的构造、析构、计时、获取其下相应3D对象等方法
2. -- AircraftActor –
继承于actor类,会在一个actor对象下挂载一个aircraft
3. -- PlayerActor (singleton) –
提供一个加载飞行器的播放器(player),并提供该飞行器相关操作的方法:发射导弹、开枪、调整羽翼等
4. -- MissileActor –
导弹类,继承于actor
5. -- SamActor –
该类控制导弹的射程范围以及发射
? Lib.lua脚本内容分析
这个脚本里面提供lua里面的基本方法:
1.//代码效果参考:http://hnjlyzjd.com/xl/wz_23993.html
lib.int(f)—将小数f整理为不大于它的整数并返回2. lib.default(arg,default)—将arg设置为default如果arg=0
3. lib.NewInstance( classTable, argTable )—返回类classTable的实力
4. lib.DerivedClass( BaseMT )—继承
5. lib.DESTROY( table, member )—销毁table中的member元素
6. lib.CompareTables( t0, t1 )—比较两者,同则true,否则false
7. lib.Iterator( t, startingKey )—迭代器,返回第k个元素的地址
8. lib.IteratorAfter( t, key )—返回key的后一个元素地址
9. lib.ArrayRemove( t, val )—删除t中元素
10. lib.ArrayRotate( t )—逆序
11. lib.CatWords( s1, s2 )—链接两者
? sim_generic.lua、sim_specific.lua脚本内容解析
提供一些通用的库函数,用于物体与模拟器的交互,提供操纵object的方法:放置于scene、删除于scene等
This extends and supplements what C++ exports to Lua.
这个脚本拓展和提供c++提供给lua的接口
? sound.lua脚本内容解析
负责声音的播放,播放主题背景音乐和事件的音乐
? startup.lua脚本内容分析
开始log文件,
加载入所有lua脚本,以供程序调用接口
? Tick.lua脚本内容解析
控制时间的,每一个timer-tick都会调用该脚本
时钟周期负责场景的刷新啊、渲染啊等工作的节奏控制
? Timer.lua脚本内容解析
负责timer-tick回调函数的注册
? Views.lua
负责飞行员的视觉的模式和亮度的调整与控制
? Wenpon.lua脚本
飞机的雷达系统控制,可以获得雷达锁定的物体,雷达是与actor结合使用的,即挂载到actor上的,具体见actor脚本
? Cmd.lua脚本
模拟器的所有操作会被记录到一个cmdline队列里面,这个脚本的任务便是从队列中取出命令并执行
? Gfx.lua脚本
负责坐标处理和图形处理的数学函数在里面
? Hud.lua脚本
抬头显示仪的控制,就是飞行员眼前的显示仪
? Joystick.lua脚本
操纵杆,就是操作人员的各种按键的控制,比如飞机坠毁后,就忽略所有按键响应
? Keyboard.lua脚本
控制键盘按键响应的
? Manipulator_mod.lua脚本
Ctrl-C:退出
Space:恢复视图
F9:线框模式
F11:重新装在scene
F12:保存画面
? Mission.lua脚本
飞行任务组,猜想可能就一个航母上面对飞机的配置和分配:保存程序状态、重置程序状态、新建target
? Mission_carrier.lua脚本
基类是mission.lua,这里面提供了mission的具体实现
将飞机放在carrier上面
对friend飞机的飞行与停止进行控制等等
? Mission_ossim.lua脚本
继续拓展mission基类。
定义了飞行演戏的地点,用户可以通过地名选择相应的地皮进行模拟。
? Replay.lua脚本
再来一局
? Scene.lua脚本
负责装入背景,根据地名和用户自定义,获知系统默认
? Scene_Goldengate.lua脚本
负责一些小东西的scene,如房子、船、导弹等等
? Games.lua脚本
1. 开始游戏,并开启计时器
2. 飞行员牺牲后重新设置游戏
3. 绑定actor,并在hud上显示(活着的飞机)
4. 接触绑定actor(坠毁后)
5. 通过名字获得actor
6. 将相应的actor和object联系起来
7. 判断actor是否是一个target(攻击对象)
8. 记录分数
9. 每一个时钟周期更新游戏数据
10. 处理撞机事件
11. 还有救援直升机
1.2.3 主要c++工程分析
? Base
如其名,很多比较底层的类在base里面实现,很多其他的工程的类继承自base里面的基类,此外base还提供了一些共享的目标文件以及timer
? Collision
这个类里面封装了底层的碰撞检测的方法,通过Dyna检测是否与其他物体发生碰撞
? Control
飞机的rate-of-roll/pitch/yaw的计算是通过动力学计算得到的。当接收到键盘的事件后在更新时候执行相应的回调函数,每次更新会轮训输入的控制队列,有事件则依稀执行。
? Lua
Lua模块包括lua_bind ,lua_lang,lua_lang提供的lua的一些接口。Lua_bing为lua脚本提供了c的接口
C++里面在program.cc对lua调用为GET_LUA().RunScript( "startup.lua" );从而把控制权交给了lua脚本
还有另外一处调用了lua脚本
void
Program::Tick( const Milliseconds millisecElapsed )
{
// Run a Lua script every tick.
GET_LUA().RunScript( "tick.lua" );
}
在c里面掉用tick不断地对场景进行刷新。
? 还有其他的一些工程,如sky,world,shader等是场景的组件,physics,math等封装一些动力学接口,palomino是整个程序的入口,即掉用startup.lua的位置。
PS:osg相关参考