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

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 老程序员分享: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相关参考

相关文章
|
6月前
|
JavaScript 安全 编译器
QT基础【2-零碎知识】
QT基础【2-零碎知识】
|
3月前
|
数据库 开发者
从EF6无缝切换到Entity Framework Core:一份详尽无遗的开发者实战攻略,带你领略数据库操作的全新境界,让代码优雅转身,性能与可维护性双丰收的秘密武器
【8月更文挑战第31天】本文通过详细的代码示例,介绍了如何将基于 EF6 的应用程序平滑迁移到 EF Core。从创建初始 EF6 项目并定义数据库上下文开始,逐步演示了如何使用 EF6 进行数据操作。随后,文章详细讲解了迁移到 EF Core 的步骤,包括配置 EF Core 数据库上下文、定义领域模型及数据操作等。通过具体示例,展示了 EF Core 的强大功能,帮助开发者构建高效且可扩展的数据访问层。
39 0
|
3月前
|
Java 应用服务中间件 Maven
从零到英雄:一步步构建你的首个 JSF 应用程序,揭开 JavaServer Faces 的神秘面纱
【8月更文挑战第31天】JavaServer Faces (JSF) 是一种强大的 Java EE 标准,用于构建企业级 Web 应用。它提供了丰富的组件库和声明式页面描述语言 Facelets,便于开发者快速开发功能完善且易于维护的 Web 应用。本文将指导你从零开始构建一个简单的 JSF 应用,包括环境搭建、依赖配置、Managed Bean 编写及 Facelets 页面设计。
94 0
|
3月前
|
C# 开发者 Windows
勇敢迈出第一步:手把手教你如何在WPF开源项目中贡献你的第一行代码,从选择项目到提交PR的全过程解析与实战技巧分享
【8月更文挑战第31天】本文指导您如何在Windows Presentation Foundation(WPF)相关的开源项目中贡献代码。无论您是初学者还是有经验的开发者,参与这类项目都能加深对WPF框架的理解并拓展职业履历。文章推荐了一些适合入门的项目如MvvmLight和MahApps.Metro,并详细介绍了从选择项目、设置开发环境到提交代码的全过程。通过具体示例,如添加按钮点击事件处理程序,帮助您迈出第一步。此外,还强调了提交Pull Request时保持专业沟通的重要性。参与开源不仅能提升技能,还能促进社区交流。
45 0
|
4月前
|
Rust 前端开发 JavaScript
IM跨平台技术学习(十三):从理论到实践,详细对比Electron和Tauri的优劣
本文主要介绍了目前比较流行的桌面应用跨平台开发技术及其架构,并以实战的方式对比了 Electron 和 Tauri 的优势和劣势,以及桌面跨平台应用开发的技术趋势。
63 0
|
存储 JSON Kubernetes
证书管理工具 cfssl 浅尝
证书管理工具 cfssl 浅尝
337 0
|
弹性计算 前端开发 IDE
High&NewTech:新物种?这是一种不需要写代码的程序猿,这事,得从Ta们掌握了 iVX工具(首个无代码编程语言)说起……
High&NewTech:新物种?这是一种不需要写代码的程序猿,这事,得从Ta们掌握了 iVX工具(首个无代码编程语言)说起……
High&NewTech:新物种?这是一种不需要写代码的程序猿,这事,得从Ta们掌握了 iVX工具(首个无代码编程语言)说起……
|
SQL 前端开发 程序员
High&NewTech:新物种?这是一种不需要写代码的程序猿,这事,得从Ta们掌握了 iVX工具(首个无代码编程语言)说起(二)
High&NewTech:新物种?这是一种不需要写代码的程序猿,这事,得从Ta们掌握了 iVX工具(首个无代码编程语言)说起……
High&NewTech:新物种?这是一种不需要写代码的程序猿,这事,得从Ta们掌握了 iVX工具(首个无代码编程语言)说起(二)
|
弹性计算 前端开发 IDE
High&NewTech:新物种?这是一种不需要写代码的程序猿,这事,得从Ta们掌握了 iVX工具(首个无代码编程语言)说起(一)
High&NewTech:新物种?这是一种不需要写代码的程序猿,这事,得从Ta们掌握了 iVX工具(首个无代码编程语言)说起……
High&NewTech:新物种?这是一种不需要写代码的程序猿,这事,得从Ta们掌握了 iVX工具(首个无代码编程语言)说起(一)
|
BI
《软件需求与分析》阅读笔记
  阅读文章《我们应该怎样做需求分析》我了解到,软件需求分析需要掌握以下内容。   需求调研:对自己需要开发的软件进行调查,了解好用户的需求,针对需求做好准备。需求调研对于一个软件开发来说,是一个系统开发的开始阶段,它的输出“软件需求分析报告”是设计阶段的输入,需求调研的质量对于一个应用软件来说,是一个极其重要的阶段,它的质量在一定程度上来说决定了一个软件的交付结果。
1276 0