现在这一部分,很大意义上是游戏的初始化部分。
很大意义上是从你点击3D游戏开始出现的画面,到这个游戏结束的一个过程经历罢了
加载roq视频文件,解压缩
在刚开始的游戏画面一般是游戏公司的标志,例如id的公司标志乃是出现的那个汽车引擎的画面,代表id的引擎
或者人的神经的样子,代表 深思(deep idea) 还记得《doom启示录》里的id公司名字的来临吗?这个就是。
一开始q3游戏就会显示加载,bsp,等等文件,你可以看见,或者在游戏中按下“~”
打开控制台,就可以看见了
windows的代码
windows->load库文件{ 检测cpu,gpu等等显卡的信息者也
检测机器的类型,比如显卡,cpu的种类之类,生成配置文件 ,
初始化d3d,初始化opengl,
初始化网络端口,鼠标,键盘的初始化,时间的记录等等,
加载cfg配置文件,配置各个系统,。。。。。。。。。。。。。等等
初始化内存空间部分,联网,
如果出现问题的话,那么在会出现了控制台就会显出错误来
创建虚拟机, 加载qvm等脚本文件,根据这个ui。qvmcgame.qvm,game.qvm等逻辑部分,
要对于文件进行编译
不断遍历虚拟机的各项状态,例如断开,运行中了等等了
如果是单机, server的配置等等,例如玩家的数目,
开始进行游戏
启动cgame中的内容,对于游戏开始状态的遍历,将硬盘文件中ui的图片,标签来进行调用渲染器来进行显示在了屏幕上面
加载Ui背景音乐
然后加载代表公司的电影,来显示
然后会出现这个ui游戏的界面部分,
一般单人部分,多人部分,设置,制作团队,退出等等这几个选项吧
然后加载代表ui的图像,文字等等在屏幕上显示出来
ui的显示部分,包括了显示部分,鼠标点击部分,菜单子菜单,按钮,标签等等。
可以按格式分为分为icon,string,图片等等,以及相应的位置.颜色。
然后在游戏运行时,被编译为机器码以后,再被render的2D部分渲染之
例如 调用这些函数
draw font
draw icon
draw 3D model
draw 2d image
等等
ui很大意义上能够调用引擎的部分函数,改变游戏中的的设置。
ui与控制台很大意义上对应的是各个部分函数对应的命令,虚拟机通过这个命令把命令转换为对应的真正的函数
来调用之,这个极为重要者也,quake3把各个部分的主要的接口例如渲染,ai,音效等等,的函数,对应成命令,
就像快捷方式一样,通过虚拟机,执行陷入 来实现汇编语言的跳转来转到真正的函数上来,整个quake3其实就是
根据命令行的输入,执行来处理的,
你可以输入控制台命令来使用引擎的功能的,例如god表示无敌,give all,给你所有的东西,这其实是控制台命令罢了
命令行驱动是quake3的运行方式,其实就是有限状态机!状态的变化使得调用的函数不同者也。
例如 (伪代码如下)
loadFile 0
readfile 1
write 2
closefile 3
addEntity 4
renderCurentFrame 5
startAI 6
举了个简单的例子,不太恰当,大致就是quake3使用一个变量,保存的各种状态等等,不断的切换各种状态,来调用的
真实的函数执行。
机器人也是用的这个。
在控制台里可以使用命令行的一部分命令了,要用这种思路来看quake3的代码,
quake3运行时,不光是quake3.exe的运行,还有一个控制台程序运行呢.要用调试的眼光看quake3
的代码。
查看内存的大小,以及那块文件未被加载,实时的调试程序,
查看每一幁的多边形多少,时间的长短,改错误。加载每一副地图,检验有没有问题,这个要求在做引擎时,要进行对
各个部分的处理信息显示完成消息在控制台里
例如我们平时玩的游戏,可以输入作弊命令的,例如god上帝模式,加载地图,加载生命值,其实都是在加载间接调用的
真正的函数运行罢了。
大致的流程
在游戏开始了以后
在cgame文件夹里包含了对于地图的场景数据,音效,等等的记录等等,很像是把物体放到房间里来,摆好位置。
在加载成功后,要在控制台显示加载成功者也。利于程序猿进行知道是否加载成功了。
对文件加载进来后,分析文件有没有问题,在进行游戏的逻辑阶段,客户端的比较简单了,就是其他的玩家显示,你自己的统计
起来发到网络,渲染,等等各部分
在加载地图后,
还要加载表示物体的模型与音效(拿去后的音效),初始化位置,动得要进行运动者也
初始化玩家信息
玩家属性包括了(1)相应的模型(三部分,头部,胸部,下部),放到3D阶段渲染。
(2) 声音(例如起跳时的声音,落到水里时的声音,死亡时的声音,受伤时的声音)
(3)玩家的生命值,弹药数目,武器,装甲等等,通过2D窗口的文字,来进行2D渲染者也
如果是bot,还要加载bot对应的脚本程序,编译,赋给bot以参数者也
等等:
(4)手里预先的的武器,gun!一般从配置文件设置出,quake3初始的默认武器就是一把机关枪。
位置,移动速度。状态(爬着,走路,跑步,游泳)等等
(5)以上是共性的一些东西,你和机器人,或者你和在某个地方的玩家的共性。
如果这个玩家就是你自己的话,鼠标与键盘初始化来控制你在游戏中的角色,一般就是枪用来来代表你自己
鼠标键盘相当于你的腿脚,枪像是你手里的武器者也,你通过武器来控制游戏中的这个枪来模拟你自己,
从而感觉你就在游戏中者也
显示部分,音效
刚发现其实玩家信息{
位置状态部分-》多人对战时,主要要更新的数据
加载配置文件的照相机的位置坐标,朝向,等等,根据照相机坐标,与pvs潜在可视集
判断你在哪个房间,其实就是根据你的坐标位置,判断你在哪个立方体的房间中,将你所在的房间或者地形画出来,
房间中的你能看到的物体画出来,你能看到的bot机器人。
正如,现实世界,你看不到山,不代表没有山,在电脑里,你看不到山,就是没有山。
在游戏运行中
我们发现了一些2D的东西,例如,玩家(的生命健康值,弹药数目,盔甲显示,自己名字,十字准星,控制台等等。
使用渲染器的2d进行渲染者也。
对于得分板分为CIT游戏类型,夺旗多着加分,
死亡竞赛 杀的人多 ,加分者也
群战 杀的对方多的,加分
等等
对于3D的渲染
则是使用的opengl把你所选的地图,敌人的数据发送到显卡中去
渲染出来
例如渲染的状态分为场景电影,2D,3D,这几个状态,分别在ui界面时,渲染器切换到2D渲染,进入游戏后,切换
到3D渲染,在播放游戏开始的画面视频时,在切换到视频的状态,每个状态对应的执行过程不同,例如3D的渲染3D
空间的物体,2D渲染的平面的物体,场景的电影,我们把它剪成一幁一幁地画上去,2D与3D的切换可使用的矩
阵的正视矩阵与透视矩阵切换而成的。
在点击了
编译所有的脚本
quake3 的脚本quakec。经历了3代的发展,脚本与游戏中的很多函数是一一对应着的,使用脚本好比是
使用装载机,人手一按操作杆,装载机立即将土挖起,在不了解源码的基础上,充分的使用整个引擎的
威力。,然后根据脚本来处理游戏逻辑者也,使得关卡设计者能够编辑脚本语言,来控制游戏流程者也
当你点击了单人部分以后
2 单人阶段
单人游戏 —>加载bsp文件,进行渲染阶段(客户端)
初始化bot数量 , 加载aas地图,根据aas地图进行机器人的人工智能阶段
根据玩家选择的bot机器人数目, 初始化bot 数量,根据bsp的entity,将表示bot,
物体的md3模型加载到内存中,根据bsp文件存放的中的位置数据,在屏幕中显示出来。
初始化bot的性格,加载表示bot性格的权重文件,使得每个bot的性格不同
导航,寻路,根据不同的地形选择不同的运动方式
机器人 -{
遇见物体,如弹药,生命值,如果缺少就拿取,拿上后,健康加值,子弹加倍
追逐目标
谈话,同一队的可以互相谈话
更新部分,如果游戏的时间未到(1)机器人或你挂了,随机选一个重生点,重生复活,继续战斗吧
(2)装甲,弹药被人拿走了,过一会时间重生,如果没拿走,继续在原位置旋转,等着
(3) 更新每个玩家的战斗成绩
当你点击了联网多人作战以后
网络部分:
网战部分,玩家可以自己在自己的机子上建立了局域网服务器,(这部分未通)
或者连到id的quake3的服务器多人对战者也。
对于玩家的ip地址首先要进行过滤,查看是否是合适的地址者也,然后给玩家建立一个记录,
1 将玩家的ip值,端口号,ip协议作为数据包的第一部分
2玩家对于服务器的命令,例如申请连接,退出,下载文件等等
3玩家之间在对战时的对话声音数据,通话信息,呼叫防守,等等信息
当然还有发送时的时间,玩家现在执行的的状态(向前走,跳黄河,举枪射击)等等一幁的信息
这三部分组织到一块后,历经赫尔曼编码压缩后
发送到服务器,处理者也
为了防止玩家作弊,需要先把玩家的数据发到服务器进行逻辑判断正确后,才发数据到客户端,使得显示者也,否则不行
在quake3之中,为了解决网络延迟,使用了udp协议,我们知道,tcp是根据的阻塞数据保证的数据能够正确的
到达,但是由于网络有问题,延迟了,丢数据报了,又得重新申请数据包,quake3直接udp,数据报出了问题后,
、直接丢了,发新的数据包,不再阻塞了,服务器直接响应,直接处理
对于玩家的机器是什么协议连到服务器的,不知道,按照玩家的协议,服务器组织数据包发到玩家手中去者也
值得注意是,quake也是分区的进行处理。
累了,隔一会在写,
在游戏中每时每刻都要进行对鼠标,键盘的检测,渲染画面等等,但我们可以往下这样子想
网络对战时:你用鼠标来控制游戏画面中手里拿的枪,按w前进了一步,将前进一步的这个数据命令发到服务器上,
服务器判断你走的地方能不能走的通,一步走多远,发送数据给你,你的机器接到后,如果能走,按服务器的数据
向前走多远。但如果你想在游戏里跳悬崖,我们知道游戏的2.5d是不让玩家跳过悬崖的,结果你就在悬崖边一直往下
按w,前进一步就是悬崖了,可就是画面还是你被挡在哪了,你就是想死都死不掉啊!
1 游戏阶段
加载配置文件 加载bsp,渲染器阶段
windows->{ 检测机器的类型,如什么显卡,什么cpu之类, ,等等,篇幅太小,难一写全
加载ui.qvm,cgame.qvm,game.qvm等,开始游戏逻辑阶段
这个游戏阶段的逻辑处理,那一天必须大改特改,现在先这样这吧 ,
3多人阶段及游戏逻辑部分
单人部分,game运行人工智能部分代码 ,不运行联网代码 ,仿照客户端-服务器端的
game——server -{
多人游戏部分,联网代码运行 ,不运行AI代码 ,运行玩家所选择的地图的逻辑部分,
场景电影管理
} ———— client ——cgame{ 声音文件的管理,
渲染数据的管理->render渲染器渲染
. ....................
client 文件夹中包含了控制台的建立,声音文件的处理,输入与输出,场景电影文件的处理等等
cgame 文件夹里包含了 粒子系统的代码 ,武器的代码,控制台客户端命令代码 ,服务器命令,
2D图片按钮的代码,得分板, 玩家数目, 加载玩家的模型文件 ,声音wav文件的解压,播放等处理
server文件夹里包含了游戏数据的下载处理,玩家所选的地图处理,命令的解析处理等等,这个有待完善
服务器与客户端的数据要经过压缩,与解压,数据压缩的越短,传输的速度就快,到了另一段后再解压
服务器端保存着每个玩家的信息,当一个玩家的信息到了,传输到所有的玩家上,广播之
早晚这一部分必须重写者也
我们打游戏的时候,鼠标键盘,的操作,无论古董级别的游戏,还是现在的游戏,都需要这个的操作的处理
画面的处理等等
引擎一共分为几个组件,渲染部分,和音频,ai,aas路径,服务器部分逻辑,将各种
渲染阶段的主要的流程,如下所示了
render->根据配置文件的来配置opengl->设置视口大小->加载bsp文件->根据 玩家位置,计算pvs潜在可视集->
找到玩家所在的房间及邻居房间+敌人模型或表示物体的模型
渲染天空,使用的天空盒进行渲染 ->
(1)表示房间多边形 数目(2)表示物体的多 边 形,(3)光源数目等等->
(1)将表示房间的多边形与表示物体或人物模型的多边形组合到一起(2)光源部分->
在确定完玩家潜在能看到的多边形后->
对玩家生成平截头体,根据平截头体,再进一步裁剪pvs中看不见的多边形,剩下的多边形其实就是一幁所要处理的图像->
将多边形进行排序,对不透明的多边形从前往后渲染,从后往前对透明的多边形先渲染->
当对于多边形阶段完了后,对多边形进行细分->
再进行 backend后置阶段,根据多边形对应的shader文件的参数则对于幁缓存区进行操作->
如果多边形是水波,人物等,则计算运动时水波,运动物体表面的颜色,加在物体的最终颜色之中,
水波计算它的波动率,而怪物,则要根据更新动画来显示出来 ,光照部分使用有光的照片代替 ->
比较深度测试,模板测试,颜色测试等等
对于纹理图片,也是根据shader文件中的格式参数,等等加载多边形相对应的bmp,jpg,tga等等图像,进行加载,
根据纹理对应的混合参数进行对应的纹理混合方式
然后再渲染阴影,如平面阴影,阴影体等等,阴影也是根据幁缓存区的内容,来生成的
渲染2D时 对投影方式进行改为正投影,使得用于渲染2D的文字,图片,按钮之类,例如生命值,弹药数
可能看起来有一些复杂,但实际的过程其实更为复杂
声音的处理上,雷神之锤3主要使用的wav文件来进行播放音乐 ,在windows上面调用d3d中的音频函数来播放
在游戏开始了以后
在cgame文件夹里包含了对于地图的场景数据,音效,等等的记录等等,很像是把物体放到房间里来,摆好位置。
在加载成功后,要在控制台显示加载成功者也。利于程序猿进行知道是否加载成功了。
对文件加载进来后,分析文件有没有问题,在进行游戏的逻辑阶段,客户端的比较简单了,就是其他的玩家显示,你自己的统计
起来发到网络,渲染,等等各部分
在加载地图后,
还要加载表示物体的模型与音效(拿去后的音效),初始化位置,动得要进行运动者也
初始化玩家信息
玩家属性包括了(1)相应的模型(三部分,头部,胸部,下部),放到3D阶段渲染。
(2) 声音(例如起跳时的声音,落到水里时的声音,死亡时的声音,受伤时的声音)
(3)玩家的生命值,弹药数目,武器,装甲等等,通过2D窗口的文字,来进行2D渲染者也
如果是bot,还要加载bot对应的脚本程序,编译,赋给bot以参数者也
等等:
(4)手里预先的的武器,gun!一般从配置文件设置出,quake3初始的默认武器就是一把机关枪。
位置,移动速度。状态(爬着,走路,跑步,游泳)等等
(5)以上是共性的一些东西,你和机器人,或者你和在某个地方的玩家的共性。
如果这个玩家就是你自己的话,鼠标与键盘初始化来控制你在游戏中的角色,一般就是枪用来来代表你自己
鼠标键盘相当于你的腿脚,枪像是你手里的武器者也,你通过武器来控制游戏中的这个枪来模拟你自己,
从而感觉你就在游戏中者也
显示部分,音效
刚发现其实玩家信息{
位置状态部分-》多人对战时,主要要更新的数据
加载配置文件的照相机的位置坐标,朝向,等等,根据照相机坐标,与pvs潜在可视集
判断你在哪个房间,其实就是根据你的坐标位置,判断你在哪个立方体的房间中,将你所在的房间或者地形画出来,
房间中的你能看到的物体画出来,你能看到的bot机器人。
正如,现实世界,你看不到山,不代表没有山,在电脑里,你看不到山,就是没有山。
在游戏运行中
我们发现了一些2D的东西,例如,玩家(的生命健康值,弹药数目,盔甲显示,自己名字,十字准星,控制台等等。
使用渲染器的2d进行渲染者也。
对于得分板分为CIT游戏类型,夺旗多着加分,
死亡竞赛 杀的人多 ,加分者也
群战 杀的对方多的,加分
等等
对于3D的渲染
则是使用的opengl把你所选的地图,敌人的数据发送到显卡中去
渲染出来
例如渲染的状态分为场景电影,2D,3D,这几个状态,分别在ui界面时,渲染器切换到2D渲染,进入游戏后,切换
到3D渲染,在播放游戏开始的画面视频时,在切换到视频的状态,每个状态对应的执行过程不同,例如3D的渲染3D
空间的物体,2D渲染的平面的物体,场景的电影,我们把它剪成一幁一幁地画上去,2D与3D的切换可使用的矩
阵的正视矩阵与透视矩阵切换而成的。
在点击了
编译所有的脚本
quake3 的脚本quakec。经历了3代的发展,脚本与游戏中的很多函数是一一对应着的,
,在不了解源码的基础上,充分的使用整个引擎的 威力。,然后根据脚本来处理游戏逻辑者也,
使得关卡设计者能够编辑脚本语言,来控制游戏流程者也
当你点击了单人部分以后
2 单人阶段
单人游戏 —>加载地图bsp文件,进行渲染阶段(客户端)
初始化bot数量 , 加载aas地图,根据aas地图进行机器人的人工智能阶段
根据玩家选择的bot机器人数目, 初始化bot 数量,根据bsp的entity,将表示bot,
物体的md3模型加载到内存中,根据bsp文件存放的中的位置数据,在屏幕中显示出来。
初始化bot的性格,加载表示bot性格的权重文件,使得每个bot的性格不同
导航,寻路,根据不同的地形选择不同的运动方式
机器人 -{
遇见物体,如弹药,生命值,如果缺少就拿取,拿上后,健康加值,子弹加倍
追逐目标
谈话,同一队的可以互相谈话
更新部分,如果游戏的时间未到
(1)机器人或你挂了,随机选一个重生点,重生复活,继续战斗
(2)装甲,弹药被人拿走了,过一会时间重生,如果没拿走,继续在原位置旋转,等着
(3) 更新每个机器人的战斗成绩
如果遇到途中的而武器,捡起,对于chat这个ai的更新,模拟现实人物的谈话,
见到敌人攻击,受伤了寻找健康包。等等
游戏逻辑的判断,单挑的死亡竞赛,谁干掉的人最多,谁胜利
组队死亡竞赛 ,红队绿队,哪一组干掉的人多,谁就胜利了,
夺旗模式,谁先把对方的旗帜抢走,谁算是胜利
等等
在这个过程中
单人部分,服务器运行人工智能部分代码 ,不运行联网代码 ,仿照客户端-服务器端的
game——server -{
多人游戏部分,联网代码运行 ,不运行AI代码 ,运行玩家所选择的地图的逻辑部分,
当你点击了联网多人作战以后
网络部分:
网战部分,玩家可以自己在自己的机子上建立了局域网服务器,(这部分未通)
或者连到id的quake3的服务器多人对战者也。
简单来说,对于玩家的ip地址首先要进行过滤,查看是否是合适的地址者也,然后给玩家建立一个记录,
1 将玩家的ip值,端口号,ip协议作为数据包的第一部分
2玩家对于服务器的命令,例如申请连接,退出,下载文件等等
3玩家之间在对战时的对话声音数据,通话信息,呼叫防守,等等信息
当然还有发送时的时间,玩家现在执行的的状态(向前走,跳黄河,举枪射击)等等一幁的信息
这三部分组织到一块后,历经赫尔曼编码压缩后
发送到服务器,处理者也
为了防止玩家作弊,需要先把玩家的数据发到服务器进行逻辑判断正确后,才发数据到客户端,使得显示者也,否则不行
在quake3之中,为了解决网络延迟,使用了udp协议,我们知道,tcp是根据的阻塞数据保证的数据能够正确的
到达,但是由于网络有问题,延迟了,丢数据报了,又得重新申请数据包,quake3直接udp,数据报出了问题后,
、直接丢了,发新的数据包,不再阻塞了,服务器直接响应,直接处理
对于玩家的机器是什么协议连到服务器的,不知道,按照玩家的协议,服务器组织数据包发到玩家手中去者也
值得注意是,quake也是分区的进行处理。
累了,隔一会在写,
在游戏中每时每刻都要进行对鼠标,键盘的检测,渲染画面等等,但我们可以往下这样子想
网络对战时:你用鼠标来控制游戏画面中手里拿的枪,按w前进了一步,将前进一步的这个数据命令发到服务器上,
服务器判断你走的地方能不能走的通,一步走多远,发送数据给你,你的机器接到后,如果能走,按服务器的数据
向前走多远。但如果你想在游戏里跳悬崖,我们知道游戏的2.5d是不让玩家跳过悬崖的,结果你就在悬崖边一直往下
按w,前进一步就是悬崖了,可就是画面还是你被挡在了
场景电影管理
client ——cgame{ 声音文件的管理,
渲染数据的管理->render渲染器渲染
. ....................
client 文件夹中包含了控制台的建立,声音文件的处理,输入与输出,场景电影文件的处理等等
cgame 文件夹里包含了 粒子系统的代码 ,武器的代码,控制台客户端命令代码 ,服务器命令,
2D图片按钮的代码,得分板, 玩家数目, 加载玩家的模型文件 ,声音wav文件的解压,播放等处理
server文件夹里包含了游戏数据的下载处理,玩家所选的地图处理,命令的解析处理等等,这个有待完善
服务器与客户端的数据要经过压缩,与解压,数据压缩的越短,传输的速度就快,到了另一段后再解压
服务器端保存着每个玩家的信息,当一个玩家的信息到了,传输到所有的玩家上,广播之
早晚这一部分必须重写者也
我们打游戏的时候,鼠标键盘,的操作,无论古董级别的游戏,还是现在的游戏,都需要这个的操作的处理
画面的处理等等
引擎一共分为几个组件,渲染部分,和音频,ai,aas路径,服务器部分逻辑,将各种
渲染阶段的主要的流程,如下所示了
渲染的大致一个流程
分为好几种状态,线程的交换,
渲染2d,
渲染3d,设置颜色,
在线程闲暇显示fps幀数
在渲染器中实现了
增加entity的函数,渲染一个entity
增加当前的渲染队列的光源的函数了,
增加动态的面,例如水波的面,还有
刷新渲染队列等等 (这里只是写的在游戏中运行的一个过程)
(1)表示房间多边形 数目(2)表示物体的多 边 形,(3)光源数目等等->,
( 经过裁剪之后。在确定完玩家潜在能看到的多边形后->
对玩家生成平截头体,根据平截头体,再进一步裁剪pvs中看不见的多边形)
(1) 双线程交换渲染,
将表示房间的多边形, 物体或人物模型的多边形,活跃的粒子,运动的模型烟雾等等加入到了
渲染队列中 组合到一起 将多边形进行从后往前的排序,
(2)光源部分->
剩下的多边形其实就是一幁所要处理的图像所需要的数据了->
在系统能够达到最大的多边形的阶段, 细分多边形,使得画面比较的逼真了,
再进行 backend后置阶段,根据多边形对应的shader文件的参数来设置entity的物体的属性
则对于幁缓存区进行操作->
根据lod来适当了model的多边形,增加多边形-》
进行alpha测试,这是为了画出透明的多边形
这个使用的c函数中的qsort快速排序,
对不透明的多边形从前往后渲染,从后往前对透明的多边形先渲染->
增加动态面
如果多边形是水波,人物等,则计算运动时水波,运动物体表面的颜色,加在物体的最终颜色之中,
水波计算它的波动率,而怪物,则要根据更新动画来显示出来 ,在游戏中的比如闪烁的灯使用flare来进行 渲染了 ->
比较深度测试,模板测试,颜色测试,来对像素进行相应的调整了。
对于纹理图片,也是根据shader文件中的格式参数,等等加载多边形相对应的bmp,jpg,tga等等图像,
进行加载,
根据纹理对应的混合参数进行对应的纹理混合方式,使用多重贴图来保证贴图的质量
然后再渲染阴影,如平面阴影,阴影体等等,阴影也是根据幁缓存区的内容,来生成的
渲染天空,使用这个brush上的sky天空纹理
最后进行gamma修正等等
渲染2D时 对投影方式进行改为正投影,使得用于渲染2D的文字,图片,按钮之类,例如生命值,弹药数
可能看起来有一些复杂,但在实际过程上更为的复杂了。
声音的处理上,雷神之锤3主要使用的wav文件来进行播放音乐
以上乃是一个比较相对简单的叙述,对于整个的游戏运行,很对内容其实是我五六年前写的,