quake3的源码的大致结构
(2017年 3月1日,我再次看了我以前写的这个博客,感觉错误之处极多,过去没有能够领悟的东西,现在领悟了很多,
从quake3引擎中,我学到了不少的东西,先做出一番改进改动)
common文件包
通用文件,基本上各个部分都需要调用的,
Vector的定义,点积叉积,法线归一化,基本的数学函数
matrix矩阵的定义,全局矩阵转化为了局部矩阵 ,
平面的定义, 等等
quake3中各种文件的定义,例如,模型md3文件,md4模型的定义, bsp文件的定义,3ds文件的定义,
对于线程操作的函数,例如线程挂起,sleep函数等
polygon多边形的分解,与组合,在关卡编辑以及引擎中可以使用的,
shader文件的定义等等 ,以及lcc脚本使用的c语言的函数等等了
mesh的定义,对于模型,md3模型或者Md4模型的作用
1 Radiant文件夹主要包括
比如对于xz,yz,xy等对话框的windows对话框的程序,mfc的对话框,xy,xz,yz等等对话框
继承了这个的,纹理图片的对话框,以及还有控制台的对话框
quake3的这个关卡编辑,相对还是比较的简单的,并不同于ce3引擎中具有首先的terrian编辑,
和 udk中的还是有着相似之处,但在虚幻3中引擎,代码中完全的
在关卡编辑器外面,乃是baseq3文件包,来进行加载shader文件的模型,
shader表示的纹理,以及entity定义的模型,来用在了关卡之中了
在doom3中,由于关卡编辑器和exe文件在一块,公用的这个游戏资源,来进行编辑加载
加入了一些新的东西,
例如 material材质脚本,以及这些资源完全和游戏资源在一块了
关卡地图 map 主要由brush(一般六个面的立方体),patch 和模型构成的,通过操作brush来建立房间。
与很多的mmorpg关卡编辑器不同,这个没有地形的生成,在gtkradient中有,有这个glsurf插件,来生成地形的,
其他物体例如怪物,灯,门,传送门,跳台model等等都是由3d max等等软件,
shader文件包含了对于这些模型将要关联的图像名字,以及一些脚本文件等等
命令台加载并转化为了md3模型
加载到了关卡中,可以在entity对话框中进行属性的设置,例如角度,还有这个名字等等的处理等等
先做成,最后在加到了编辑器中了
在雷神把地图编辑器中,使用地图编辑器的功能来实现编辑房间,设置物体摆放的位置,
触发器位置,重生点位置,路径点,最后保存格式为map文件,建议下载一个雷神地图编辑器看一下。
quake3的地图编辑源码
主要包含了mfc的这个对话框的继承,例如照相机的对话框,xy,yz,z,控制台对话框等等
command控制台,用来编辑器的各项操作,比如文件有没有加载成功,bsp的结果怎么样子,有没有什么错误等等了
对于错误的检验最为重要,有没有加载文件,生成bsp文件中的错误等等
quake3主要使用的特有的brush来进行生成,组合,hollow,csgadd,csgsub等等跟ue,半条命等等很是类似,
patch的生成,组合,可以用来做曲面的等等
model,m3模型,加载进来,设置角度,位置,放在关卡中了即可
light,作为entity的一种,在编辑器中表示光源,半径一般300,
surface继承的mfc的对话框,主要有面的类型,wave水面,岩浆,梯子,等等,以及fit等等对于纹理进行uv的调整,h,l方向的平移,等等了
texture文件框,显示用到的纹理,一般按下n即可了 ,加载shader文件, 来进行解析了者也将会显示出来图像的一个对话框来,从中可以选择材质图像,来添加使用到关卡中
entity,在q3中,表示物体的属性的设置,比如位置,角度,物体的名字,类型,属于第几个number Entity的号码,等等
对于所有的实体,为了进行删除,选择等操作, q3基本上一个双向链表存储的 物体可以用来 插入,删除,撤销,以及进行查找,比如经常要查找某个物体就可以找到它了
bsp菜单,分为快速 bsp,+vis,+light,等等命令,下放到q3map阶段处理了,生成游戏实体的包围盒,
用于碰撞检测,
在quake3的多人游戏中,服务器必须加载bsp文件,来用于碰撞检测。
在doom3游戏中,直接的生成了cm文件,我认为可以选择的在一个服务器上选择加载不加载cm碰撞检测文件了。
GtkRadiant也包含了aas的命令了,生成路径以及玩家们的,调用了aas动态库,但在有的关卡编辑版本中,直接全部的编辑为了exe文件
编辑好的地图数据保存在map文件中 , 主要是生成表示场景物体的几何部分
2 生成关卡地图用的软件源码
q3map这个文件夹中 包含了地图中的entity,通过建立bsp树来查入到了树中,然后对于在这个树中的节点生成包围盒,包围球体,来进行光照了,
在doom3代码中,增加了对于阴影体的判断,预先计算出来那些物体是有阴影体了。
aas这个文件夹主要保存的乃是地图中地区的属性,可以通过的路径的生成
这个其实属于关卡编辑器地图的编译部分
生成bsp文件过程
2. botlib文件内则生成了 Bot机器人运动时会所用到的东西,比如bot的名字,性格,模型在运行时候会加载。
文件夹中包含了初始化bot的性格脚本文件,加载表示bot性格的权重文件,使得每个bot的性格不同
以及机器人的说话文件chat,谈论文件,屏幕上方的红色,机器人说话文字等等就是
机器人 的ai包括了 (1) 移动的ai : 导航,寻路, 追逐目标,寻路根据不同的地形选择不同的运动方式 ,遇见物体,如弹药,生命值,如果缺少就拿取,拿上后,健康加值,子弹加倍
(2) 谈话ai,同一队的可以互相谈话
(3) 武器ai,例如机器人选择威力最强的枪支,等等
例如bot运动时经过的房间,行走的路径,顶点等等
设置机器人行走的速度等参数,例如在水中跳得多高,游的多快。 这样使得bot(机器人)遍历face时,采取对应的行动方式
在游戏运行的时候,会根据aas里的area结构体face类型进行运动方式,雷神寻径是在face里寻路,
face的类型乃是在关卡编辑的时候可以指定的,可以决定玩家遇到了梯子,能够的上墙的,遇到了水面可以切换成 了游泳的方式了
4 client文件包的代码
windows文件夹中包含了 对于windows的操作,音频,opengl render,网络的一层封装,有利于跨平台
Linux文件夹中包含了linux系统中的画面,系统操作输入输出,网络 等的函数,
cgame文件夹中,主要乃是运行在了客户端的代码了
根据cfg配置文件的内容,来配置客户端,cl的配置,
其中包含了很多的文件,主要乃是加载游戏运行参数,例如画面的系数,声音和操作配置文件,
不断的遍历状态
网络的操作的话,对于套接字发来的信息文件的处理了
游戏画面的更新,机器人ai的处理 等等文件了
将表示机器人物体的md3模型加载到内存中,根据bsp文件存放的中的位置数据,在屏幕中显示出来。
server文件包的代码
server文件夹里包含了游戏数据的下载处理,玩家所选的地图处理,命令的解析处理等等文件了。
对于服务器端的一些函数的处理,比如玩家掉线,加入到了游戏中,对于玩家和地图的管理了。
服务器与客户端的数据 要经过压缩,与解压,数据压缩的越短,传输的速度就快,到了另一段后再解压
服务器端保存着每个玩家的信息,当一个玩家的信息到了,传输到所有的玩家上,广播之
game文件
对于联网游戏和单机的打bot的模式的游戏逻辑的处理了。
游戏分为四种类型,死亡竞赛,夺旗模式,组队死亡竞赛,四种,各种具有不同的游戏逻辑
quake3ui的代码
c语言写就的button,提供了一
基本上结构体定义的button,位置,menu菜单,标签,
doom3的ui彻底的换掉了这个ui系统 ,使用了c++重新的改写了ui系统了,但是渲染部分的
一部分代码仍然遗传在doom3中,
网络消息的解析
例如服务器的命令解析,下载等等内容的解析了
玩家更新部分,可能是机器人或者网络作战
例如如果游戏的时间未到(1)机器人或你挂了,随机选一个重生点,重生复活,继续战斗吧
(2)entity物体方面的更新装甲,弹药被人拿走了,过一会时间重生,如果没拿走,继续在原位置旋转,等着
(3) 更新每个玩家的战斗成绩等等 更新每个玩家得分板的数目 , 判断胜负,
free of all,死亡竞赛,谁杀的人多算谁赢
夺旗,那支队伍拿到的对方的旗帜数目多,算谁赢了
跟render有关系的函数
视频的roq文件,加载到了内存中,调用渲染器中的函数来进行渲染了
2d的ui,游戏中的,hud等等包含的字体,图片下放到了渲染器
3d层(大致的一个过程,其实都是函数的,不是连续的,只是我觉得这样子写比较好,不较真了)
根据配置文件的来配置opengl->设置视口大小->加载bsp文件->根据 玩家位置,计算pvs潜在可视集->
找到玩家所在的node节点 ,先渲染前面的面,后来后面的面,再两边的面了
+敌人模型或表示物体的模型->加起来的多边形,下放到了渲染器来进行显示了
增加的粒子系统的数目,下放到了渲染器中来进行渲染的