老程序员分享:palomino项目简要分析(开源,基于osg)

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 老程序员分享:palomino项目简要分析(开源,基于osg)

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相关参考

相关文章
|
8月前
|
缓存 运维 语音技术
【Python 自动化】自媒体剪辑第一版·思路简述与技术方案
【Python 自动化】自媒体剪辑第一版·思路简述与技术方案
80 0
|
3月前
|
算法 安全 Linux
【C++STL简介】——我与C++的不解之缘(八)
【C++STL简介】——我与C++的不解之缘(八)
|
8月前
|
SQL 存储 分布式计算
Kylin使用心得:从入门到进阶的探索之旅
【5月更文挑战第2天】Apache Kylin是开源大数据分析平台,提供亚秒级OLAP查询。本文深入解析Kylin的工作原理,包括预计算模型Cube、构建过程和查询引擎。常见问题涉及Cube设计、查询性能和资源管理,解决方案涵盖合理设计、性能监控和测试验证。文中还分享了Cube创建的JSON示例,并探讨了Cube构建优化、查询优化、与其他组件集成、监控维护及生产环境问题解决。通过学习和实践,读者能有效提升数据洞察力和决策效率。
467 5
结构体全解,适合初学者的一条龙深度讲解(附手绘图详解)下
结构体全解,适合初学者的一条龙深度讲解(附手绘图详解)
71 0
|
存储 缓存 NoSQL
仿牛客社区项目(第四章)(总)
仿牛客社区项目(第四章)(总)
199 0
仿牛客社区项目(第四章)(总)
|
存储 缓存 NoSQL
仿牛客社区项目(第四章)(下)
仿牛客社区项目(第四章)(下)
104 0
仿牛客社区项目(第四章)(下)
|
消息中间件 存储 缓存
仿牛客社区项目(第四章)(上)
仿牛客社区项目(第四章)(上)
79 0
仿牛客社区项目(第四章)(上)
|
消息中间件 前端开发 Java
仿牛客社区项目(第五章)(下)
仿牛客社区项目(第五章)(下)
97 0
仿牛客社区项目(第五章)(下)
|
消息中间件 存储 Java
仿牛客社区项目(第五章)(上)
仿牛客社区项目(第五章)(上)
183 0
仿牛客社区项目(第五章)(上)
|
消息中间件 存储 前端开发
仿牛客社区项目(第五章)(总)
仿牛客社区项目(第五章)(总)
225 0
仿牛客社区项目(第五章)(总)

热门文章

最新文章