quake3源码大致结构

 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节点 ,先渲染前面的面,后来后面的面,再两边的面了

         +敌人模型或表示物体的模型->加起来的多边形,下放到了渲染器来进行显示了

         增加的粒子系统的数目,下放到了渲染器中来进行渲染的 

    


 

 

 

 

 

 

 

你可能感兴趣的:(quake3)