cgame游戏逻辑部分
quake3的代码烦乱,我自己的水平又不到家,导致我自己写出的代码也是乱七八糟,但是我看了一下,
改动写好根本上太难了
先初始化了渲染器,音频视频,操作,网络之后
clintgame
客户端游戏游戏逻辑部分
这个部分根本没有固定的顺序的,我根据一般玩游戏的过程来写的,其实引擎中从3d的场景退出,显示2d的ui,只不过是状态的切换而已,根本没有任何的顺序了者也
cgame部分
/*
-----------------------------------------------------
cgame开始部分
-----------------------------------------------
*/
main部分的处理者也
初始化部分
加载配置文件
这个cvar配置文件这个从中提取到了各种配置,
cvar记录了整个游戏的各项参数
更新这个cvar的处理,这个使得变量的遍历更好者也
每一帧生成了这个渲染命令来进行这个这个对于局部的这个entity的操作者也
还有对于这个引擎运行过程中的这个日志和这个其他的一些东西者也
vmCvar_t *vmCvar;
char *cvarName;
char *defaultString;
int cvarFlags;
}cvarTable_t;
这个cvar这个变量这个东西保存了关于quake3的设置者也
例如
cgame的各项的配置文件的东西的一个处理了
控制台命令
{ &cg_ignore, "cg_ignore", "0", 0 }, // used for debugging
{ &cg_autoswitch, "cg_autoswitch", "1", CVAR_ARCHIVE },
{ &cg_drawGun, "cg_drawGun", "1", CVAR_ARCHIVE },
// 画枪支的显示位置
{ &cg_zoomFov, "cg_zoomfov", "22.5", CVAR_ARCHIVE },
{ &cg_fov, "cg_fov", "90", CVAR_ARCHIVE },
{ &cg_viewsize, "cg_viewsize", "100", CVAR_ARCHIVE },
{ &cg_stereoSeparation, "cg_stereoSeparation", "0.4", CVAR_ARCHIVE },
{ &cg_shadows, "cg_shadows", "1", CVAR_ARCHIVE },
{ &cg_gibs, "cg_gibs", "1", CVAR_ARCHIVE },
这些乃是画出来最最基本的函数了,很多是ui,hud所要调用的函数了
{ &cg_draw2D, "cg_draw2D", "1", CVAR_ARCHIVE },
//画2d
{ &cg_drawStatus, "cg_drawStatus", "1", CVAR_ARCHIVE },
{ &cg_drawTimer, "cg_drawTimer", "0", CVAR_ARCHIVE },
{ &cg_drawFPS, "cg_drawFPS", "0", CVAR_ARCHIVE },
{ &cg_drawSnapshot, "cg_drawSnapshot", "0", CVAR_ARCHIVE },
{ &cg_draw3dIcons, "cg_draw3dIcons", "1", CVAR_ARCHIVE },
{ &cg_drawIcons, "cg_drawIcons", "1", CVAR_ARCHIVE },
{ &cg_drawAmmoWarning, "cg_drawAmmoWarning", "1", CVAR_ARCHIVE },
//这个弹药耗尽等等的警告
{ &cg_drawAttacker, "cg_drawAttacker", "1", CVAR_ARCHIVE },
{ &cg_drawCrosshair, "cg_drawCrosshair", "4", CVAR_ARCHIVE },
//画出了十字的函数,这个枪口的标志
{ &cg_drawCrosshairNames, "cg_drawCrosshairNames", "1", CVAR_ARCHIVE },
{ &cg_drawRewards, "cg_drawRewards", "1", CVAR_ARCHIVE },
{ &cg_crosshairSize, "cg_crosshairSize", "24", CVAR_ARCHIVE },
十字的尺寸
{ &cg_crosshairHealth, "cg_crosshairHealth", "1", CVAR_ARCHIVE },
quake3的这个设置功能就是改变这个配置文件的一个过程了者也
在运行时候乐意通过控制台来加以改变的,也可以在设置的菜单中,来改变一部分的配置文件了
错误信息的输出者也,使用日志来处理了
调用这个cg各部分的函数来进行这个处理者也,循环不断的来进行遍历游戏的各种状态
例如cg_init初始化等等
/*
-------------------------------------------------
输入输出的逻辑处理
---------------------------------------------------
*/
操作的函数的处理
键盘的事件等等的处理
画这个活跃的一幁者也
_CrosshairPlayer
cg_t cg;
cgs_t cgs;
centity_t cg_entities[MAX_GENTITIES];
weaponInfo_t cg_weapons[MAX_WEAPONS];
itemInfo_t cg_items[MAX_ITEMS];
对于所有的武器,以及物体来分配内存来进行处理了
对于这个cgame期间的这个最大的武器数量,分配数组
最大的这个图标数目进行分组者也
。。。。。
来进行这个画十字交叉,画fps,画2d的显示等等的处理者也
记录这个cfg文件的值,cvar这个来进行存储这个cfg文件的这些内容者也
这个在游戏一开始记录游戏的配置文件者也
然后加载一个关卡地图的所有的声音文件者也
如果这个配置发生了改变,那么更新这个cvar这个变量等等
更新的cvar
加载表示玩家的头部,胸部,腿部等等3个md3模型者也,
cg.crosshairClientNum
上一个攻击者
打印输出信息
输出错误者也
CG_RegisterItemSounds
The server says this item is used on this level
记录这个item这个图标的声音者也
CG_RegisterSounds记录这个声音者也
CG_RegisterGraphics记录这个图形的处理等等
This function may execute for a couple of minutes with a slow disk.
显示这个地图的名字,然后加载这个地图者也
加载这个gdx的里面的这个3d设置,关于2d的这个设置者也
加载水中的声音
加载这个得分板的声音的处理等等
type 0 - no event handling
1 - team menu
2 - hud editor
/*
--------------------------------------------------
CG_LoadHudMenu();
--------------------------------------------------
*/
加载这个hud文件,也就是这个游戏时的这个,生命值,健康值,还有武器的弹药值等等
信息的处理等等者也
ui的这个hud,这个的显示,对于生命值,弹药的菜单等等的处理者也,
加载ui的显示文件了
/*
-------------------------------------------------
加载游戏的各项资源
-------------------------------------------------
*/
加载关卡中要用到的这个视频文件roq文件
播放这个视频等等的处理者也
加载roq quake3的专属视频文件,调用渲染器里面的画出图片的函数来进行渲染这个视频了者也
包括了以下的函数,例如
CG_DrawCinematic(int handle, float x, float y, float w, float h) {
播放这个视频的值
加载视频
画这个视频
释放roq文件的内存函数
这个加载上了这个cin文件,来进行这个视频的显示部分者也
Text_PaintWithCursor
CG_FeederItemText(
CG_SetScoreSelection
CG_LoadMenus(const char *menuFile)
加载这个菜单的文件者也
这个乃是对于ui来调用的函数了
CG_PlaceString
Also called by scoreboard drawing
输出这个1,2,3名字的等次者也,在这个游戏结束后进行这个显示
(游戏逻辑部分的)
对于这个游戏过程中要处理的这个物体对象包括了
游戏开始前,要初始化这些
还有对于客户端和这个服务器端先要约定,游戏的类型
游戏的地图,玩家总数等等
玩家,武器,粒子系统,还有其他的entity物体者也
初始化玩家信息
玩家属性包括了(1)相应的模型(三部分,头部,胸部,下部),放到3D阶段渲染。
(2) 声音(例如起跳时的声音,落到水里时的声音,死亡时的声音,受伤时的声音)
(3)玩家的生命值,弹药数目,武器,装甲等等,通过2D窗口的文字,来进行2D渲染者也
如果是bot,还要加载bot对应的脚本程序,编译,赋给bot以参数者也
等等:
(4)手里预先的的武器,gun!一般从配置文件设置出,quake3初始的默认武器就是一把机关枪。
位置,移动速度。状态(爬着,走路,跑步,游泳)等等
typedef struct {
lerpFrame_t legs, torso, flag;
int painTime;
int painDirection; // flip from 0 to 1
int lightningFiring;
// railgun trail spawning
vec3_t railgunImpact;
qboolean railgunFlash;
// machinegun spinning
float barrelAngle;
int barrelTime;
qboolean barrelSpinning;
} playerEntity_t;
玩家的头部模型,可以不同,下面下身可以相同了,这样子有利于模型的重复利用了者也
=====================
NON-TEAMPLAY
=====================
-------------------------------------------------
headmodel = *callisto/lily
models/players/heads/callisto/lily/head_default.skin
models/players/heads/callisto/head_lily.skin
-------------------------------------------------
headmodel = callisto/lily
models/players/callisto/lily/head_default.skin
models/players/callisto/head_lily.skin
models/players/heads/callisto/lily/head_default.skin
models/players/heads/callisto/head_lily.skin
/*
-------------------------------------------------------
玩家状态
----------------------------------------------------
*/
playerstate,如果检查玩家的这个弹药,如果弹药减少的话,那么给玩家一个警告者也
或者给玩家弹出来一个消息了者也
检查附近的这个声音者也
武器的处理
vm-test
得到了玩家的命令:这个真的很复杂啊
trap_GetUserCmd( int cmdNumber, usercmd_t *ucmd );
// used for the weapon select and zoom
void trap_SetUserCmdValue( int stateValue, float sensitivityScale );
设置玩家的命令的 值
cgame
视图类
测试这个模型
测试枪
测试这个其他的东西等等
2d显示部分
-----------------------------------------------
控制台
初始化这个控制台
-----------------------------------------
*/
控制台命令
例如增加命令,减少命令,执行命令等等
例如god的上帝模式
give all,给于所有
get health给于健康等等
逻辑部分的处理一些
cg的控制台命令等等,、
增加多边形等等的处理等
诚然,控制台是对引擎进行管理,测试的,不是引擎的必需品,但是没有这个,是很难做出引擎的,没有控制台,就像瞎子摸黑一样,
你不知道内存到底占用了多少,某个函数是否工作了。就像操作系统的v86管理模式一样,使得引擎在正常的情况下运行者也。
这是维持引擎正常运行的寄生品,管理引擎的东西,
就像windows可以想菜单一样,也可以使用命令行来启动程序,quake3你可以使用菜单调用一部分功能,也可以使用控制台调用功能者也。
这个控制台的cgame部分的处理者也!
初始化控制台命令
判断是否为控制台命令
例如这个god命令,give all
server这个寻找这个加载地图者也,寻找这个cluster,者也
对于ai部分,bot的处理者也
服务器的命令者也
/*
-----------------------------------------------
开始游戏后
---------------------------
*/
3d部分,指的是这个加载具体地图,拿枪扫射以后的情况处理了者也
/*
--------------------------------------------
照相机
---------------------------------------
*/
加载bsp地图文件存储的中的这个照相机的位置,,朝向,
即在地图编辑器中必须指定的这个playerStart点
来确定了这个玩家的初始位置
第一人称和第三人称的照相机可以使用这个控制台来设定的
cg_thirdPerson 0或者为1则可以设置这个为第三人称的照相机了
zoom这个缩放视图
第三人称的话,给玩家一个第三人称的照相机,
加载照相机
开始照相机的处理
等等,根据照相机坐标,与pvs潜在可视集
判断你在哪个房间,其实就是根据你的坐标位置,判断你在哪个立方体node的房间中,
将你所在的房间或者地形画出来,
房间中的你能看到的物体画出来,你能看到的bot机器人。
得到了这个entity的值
加载这个字符串
加载字符
加载客户端
画出这个信息
/*
-----------------------------------
渲染部分的
---------------------------------
*/
cg_draw.c
调用渲染器的各种函数了
得到了opengl的配置
得到游戏的状态
得到了服务器的命令
在cgame层进行增加了这些渲染器的面等等函数了
增加多边形对于场景
增加灯光对于场景
MarkPolygon
这个增加的entity来显示了者也,
来显示处理客户端的部分的处理
例如增加粒子到屏幕上面,
增加effect到屏幕上
*
----------------------------------------------
对于服务器发过来的信息来进行处理了者也
----------------------------------------------
*/
CG_SetEntitySoundPosition( cent )
进行这个分析,
例如分析这个得分,来进行判断最后的胜利者和排名次序了
分析这个team的信息者也
分析这个游戏类型,
ping的处理等等
最大客户端,
限制时间的处理等等
CG_SetConfigValues
CG_ExecuteNewServerCommands
执行这个服务器发过来的信息者也
服务器信息包括了chat,vchat等等信息的处理者也
输出这个错误信息
接受这个服务器信息
接收服务器命令
控制台命令者也
对于地图的处理等等
/*
------------------------------------------
声音部分的处理
--------------------------------------
*/
开始局部的声音
清除局部的声音
增加循环声音
增加真实的声音
更新这个实体的位置
/*
-------------------------------------
检查事件的处理
----------------------------------
*/
cg_event.c
这个entity的事件处理
event的处理
weapon events
武器的事件,包括武器没有了弹药
武器开火
改变武器
玩家进入电梯,
玩家从电梯中出来等等
EV_ITEM_RESPAWN:
view文件的这个测试这个声音等等,还有这个播放声音等等的处理等等
玩家组队时类型等等
伤害力计算等等,怎么来进行这个伤害的计算呢?
如果说把这个botlib比作是这个游戏中的机器人的话,那么这个client乃是你机器上的这个配置
,cgame乃是指的是客户端上的你自己这个东西,显示什么,输出什么的
这个botlib乃是指的是这个机器人,aas乃是指的是机器人的类型者也,
我终于理解雷神之锤了!
cvar这个配置文件的变量的处理,老实说这个quake3真的很麻烦的,
cgame里面包含了很多的菜单图片之类的东西了者也!
声音的缓存者也,这个必须赶紧完了,我希望了者也
分析这个服务器命令者也
受伤力的反馈者也,
对于player加载这个表示这个玩家的这个模型,
加载玩家的声音等等
对于
对于这个声音的分配等等
对于网上传来的消息,分为game消息,还有这个下载等等,还有其他的消息一点点的处理者也
奥我们要得到了这个客户端的名字,客户端的皮肤,模型啊,怪不得这个逻辑部分
可以设置这个玩家的bot和这个玩家的名字,还有其他的一些东西了,
我很怀疑这个配置文件里面有这个quake3的这个东西了者也
检查这个图标被捡起了
游戏类型实现从配置文件中得到了
最大的client这个数量者也
/
/*
---------------------------------------------
对于ui,(例如我们看到了)
调用这个ui的显示部分者也
开始游戏前菜单中的显示部分
文件中关于这个text宽度,长度,画一个3d模型在游戏的界面上了
---------------------------------------------------
*/
画头部,怪不得quake3这个在选人时这个三部分
画这个标志模型
画这个组队竞赛的背景者也
画出默认的工具条
画攻击,画出这个工具条等等
画出fps者也
画出这个时间
画出得分来
画出所有的active来者也
画出武器的选择
画出2d的东西来者也,我估计2d的文字,还有2d的图片等等都要画出来者也
画出来这个十字准星者也
调整为640等等
画出这个选择地图来者也
asm系统调用者也
sysCall
2d的显示部分hud,这个
还有整个的这个玩家的弹药数目,还有这个健康值图标的显示
最后的得分板中的显示部分
3d的显示部分
玩家的位置乃是从这个bsp文件中存储的这个playStart点位置来开始的者也
在cgame文件夹里包含了对于地图的场景数据,音效,等等的记录等等,很像是把物体放到房间里来,摆好位置。
在加载成功后,要在控制台显示加载成功者也。利于程序猿进行知道是否加载成功了。
对文件加载进来后,分析文件有没有问题,在进行游戏的逻辑阶段,客户端的比较简单了,就是其他的玩家显示,你自己的统计
起来发到网络,渲染,等等各部分
在加载地图后,
还要加载表示物体的模型与音效(模型的音效),初始化位置,
当游戏开始前,可以选择这个bot数量,或者bot的多少者也,具体到了选择的那个bot,不然就按照游戏的默认设置来进行者也!在游戏的运行中也可以进行这个bot值的设置者也!
游戏过程中
(1)
在cgame文件包中定义了玩家的走,蹲,跳,跑,爬梯,等动作。
如果是多人游戏,还有发送这个数据包
分析下载,分析服务器的命令,分析这个game的东西
等等各项的命令者也
写这个数据包,等等
单人的则不用了
可以表示的你所在这个电脑上的操作,由于这个quake3的单人阶段也是模拟网络游戏这个阶段来处理的
所以主要负责的你的电脑上的这个输入输出,文件读取等等,
从而来判断这个玩家的平移,向左走,向右走等等的处理,
例如在游戏的控制中,我们可以绑定,玩家的射击,蹲下,跳跃等等键值的绑定,等等还有对于
绘制,音频,网络部分的处理等等。
粒子系统,照相机等等的处理
玩家部分的处理
(2)玩家的状态包括了
遇到敌人
遇到了传送门,跳台等等
对于fps游戏而言,玩家控制的角色,要具有看到物体的视锥,那么需要给玩家一个照相机,等于给玩家加上了一个眼睛
跑跳,蹲下,爬,火箭跳,
等等,同理,机器人也要具备这个跑跳,走,游泳等等逻辑的实现等等
玩家具有健康值,
bot也具有这个的健康值
玩家可以跳跃,游泳,攀爬,跑步,行走,射击,抓取,飞行,火箭跳,drag平移跳,
(有关这个火箭跳,这个怎么来实现的这个真的很难的,物理上计算这个很不容易的 )
跑动的 ,得到物体,
怪物也具有相同的这个属性等等
也可以得到物体的
怪物也可以跳跃,跑动的,攀爬等等动作者也
得到了弹药后,要增加弹药的值,如果弹药到了200点,那么就为200点的值者也
捡起了物品武器之后,如果,这个武器没有增加,
得到了生命值,健康以后,玩家的生命值增加者也
总之怪物与玩家的这个属性是相同的,
(3)
在bsp文件中,这个部分很可能就是这个game逻辑部分的东西了者也
遇上的东西可能有这个
/
-----------------------
武器
--------------------------
*/
武器结构体中定义了武器声音,武器名称,武器md3模型,等,至于武器距离,大小等文件中导入,
例如,武器脚本(见脚本部分对于武器的描述)
name "bfgexploision"//武器的名字为bfg
damage 40 //伤害值
radius 100 //杀伤半径
damagetype $evalint(DAMAGETYPE_IMPACT|DAMAGETYPE_RADIAL)//伤害类型为弧形伤害
加载这个武器的模型,声音等等
如果武器开枪了,发出烟雾了等等的处理
武器的位置由bsp地图文件中找到的
而bsp地图文件中的这个由关卡编辑器产生的map文件指定的
例如
// entity 5
{
"classname" "weapon_shotgun" //entity为这个武器
"origin" "-200 -200 64" //武器的位置
}
客户端武器模型的显示位置不同的,例如
武器自带的这个粒子系统的显示部分了者也
对于武器,有武器开枪时候的声音者也,武器的伤害事件了者也
如果在水里的话,有这个阻力的出现的,要考虑进去的
武器开火时,如果弹药不是无限的,那么减少这个弹药的值者也
武器重装时,我们检查这个弹药的值者也,如果这个武器的弹药完了,那么就重装时间到了
画这个武器的爆炸声等等
碰撞检测怎么来处理呢?
菜单加载上了menu来表示这个ui的处理了者也
对于弹药,生命值等等图标的绘制者也
武器的信息了者也
// each WP_* weapon enum has an associated weaponInfo_t
// that contains media references necessary to present the
// weapon and its effects
// each IT_* item has an associated itemInfo_t
// that constains media references necessary to present the
// item and its effects
typedef struct {
qboolean registered;
qhandle_t models[MAX_ITEM_MODELS];
qhandle_t icon;
} itemInfo_t;
武器的一些信息
typedef struct weaponInfo_s {
qboolean registered;
gitem_t *item;
qhandle_t handsModel; // the hands don't actually draw, they just position the weapon
qhandle_t weaponModel;
qhandle_t barrelModel;
qhandle_t flashModel;
vec3_t weaponMidpoint; // so it will rotate centered instead of by tag
float flashDlight;
vec3_t flashDlightColor;
sfxHandle_t flashSound[4]; // fast firing weapons randomly choose
qhandle_t weaponIcon;
qhandle_t ammoIcon;
qhandle_t ammoModel;
qhandle_t missileModel;
sfxHandle_t missileSound;
void (*missileTrailFunc)( centity_t *, const struct weaponInfo_s *wi );
float missileDlight;
vec3_t missileDlightColor;
int missileRenderfx;
void (*ejectBrassFunc)( centity_t * );
float trailRadius;
float wiTrailTime;
sfxHandle_t readySound;
sfxHandle_t firingSound;
qboolean loopFireSound;
} weaponInfo_t;
武器这个东西,由于客户端和服务器端都有这个对于武器的处理,判断,但是在写的过程中,
这个武器,很难写的,只要这样子处理了
物体的显示部分在客户端,但是逻辑部分在服务器端了
A fragment localentity interacts with the environment in some way (hitting walls),
or generates more localentities along a trail.
这个reEntity这个的增加者也
火箭几种目标后的这个反弹速度的处理,还有这个增加一个爆炸的声音的处理等等
计算这个反弹后的这个速度的处理
还有这个平衡声音的处理等等,
这个血雾和这个其他的东西等等
我们要判断这个得分谁是1,2,3名,然后显示出来者也!
武器的脚本
(此非cgame部分运行时候要用到的,只是为了叙述的方便写的)
对于这个武器的重装的状态的处理者也
这个加载上了武器的伤害类型,那么最后解析时对于这个武器的伤害的脚本的这个解释者也
对于伤害类型的解析者也
name "bfgexploision"
damage 40
radius 100
damagetype $evalint(DAMAGETYPE_IMPACT|DAMAGETYPE_RADIAL)
这个武器shader脚本中居然有这个者也
对于武器,加载武器脚本
武器的ai脚本,我们从中加载这个的,
武器的名字者也
武器的杀伤半径多大,武器的这个伤害类型的处理等等
这样子的话,各种武器的伤害值,
还有各种伤害类型的处理等等,比如弧形伤害,圆形伤害等等的处理
对于脚本,加载了这个脚本文件,分析这个脚本文件的这个变量者也
weaponinfo //Railgun轨道枪的处理者也
{
name "Lightning Gun"
number WEAPONINDEX_LIGHTNING
projectile "lightning"
numprojectiles 1
speed 0
} //end weaponinfo
这个光线枪的名字,武器这个数量
武器的投影文件,乃是玩家的枪口投送出去的投影
武器的速度者也
枪花!,例如这个枪支在这个射击的时候
projectileinfo //for Lightning
{
name "lightning"
damage 24
damagetype DAMAGETYPE_IMPACT
}
武器的这个名字,伤害值的大小
伤害的类型属于什么伤害了者也
伤害或者接触
!
设定这个1是gauntel枪
2是机关枪
3是这个散弹枪
4是这个掷弹筒
5是这火箭筒(这个武器我最最喜欢,火箭在手,所向披靡!)
6是这个电光枪
7是这个离子枪
8是这个bfg (big fuck gun!)
9是这个电锯
/*
--------------------------------------------------
武器
--------------------------------------------------
*/
上一个武器
下一件武器,
换枪
新建一个武器
记录武器
武器开火,,
各种武器的粒子系统,例如火箭,手枪,机枪,闪电,等等的枪支的粒子系统的处理
这个武器装弹时候的声音和这个发射时候的声音不同了者也
武器的发射偏移了者也
这个关于武器后坐力的计算,还有这个各种武器的粒子效果不同了者也
对于弹药,生命值等等图标的绘制者也
/*
---------------------------------------------------
cg_effects.c
---------------------------------------------------
*/
关于各种武器的爆炸效果者也
大爆炸
必须写上了这个武器发射以后的各种情况,还有这个不同的武器的处理方式等等,
例如狙击枪,火箭弹
击中了物体后的这个爆炸,
烟雾,还有这个对于物体的这个冲撞情况等等的处理者也
粒子系统的处理
初始化粒子系统
增加粒子
粒子烟雾
粒子爆炸
各种武器的粒子系统,例如火箭,手枪,机枪,闪电,等等的枪支的粒子系统的处理
/*
-------------------------------------
item
--------------------------------
*/
使用这个itom这个图标者也
图标的捡起
伤害,如果这个健康低于多少了,那么放出这个伤害的声音者也
实体的事件者也
检查这个时间者也!
这个quake3中居然也是用这个插入点,对于网格插入了这个点,来使得宏观网格来进行这个处理者也
真是复杂啊trap_R_AddRefEntityToScene( &shockwave );
增加这个渲染的实体到这个屏幕上去者也
/*
---------------------------------------------------
entity
cg_activeLocalEntities
---------------------------------------------------
*/
在客户端上的这个实体的状态的遍历,来进行对于表示entity的模型的位置,
角度的处理,例如对于entity的产生,平移,缩放等等的处理了
typedef struct localEntity_s {
struct localEntity_s *prev, *next;
leType_t leType;
int leFlags;
int startTime;
int endTime;
int fadeInTime;
float lifeRate; // 1.0 / (endTime - startTime)
trajectory_t pos;
trajectory_t angles;
float bounceFactor; // 0.0 = no bounce, 1.0 = perfect
float color[4];
float radius;
float light;
vec3_t lightColor;
leMarkType_t leMarkType; // mark to leave on fragment impact
leBounceSoundType_t leBounceSoundType;
refEntity_t refEntity;
} localEntity_t;
局部的entity的这个的处理了者也
对于实体的增加,状态的遍历,例如在服务器端上的门的状态的开关,
还有电梯的处理等等,在客户端上来进行显示出来了
在这个cgame里面活跃这个的entity物体等等的处理者也
如果是精灵的爆炸,那么增加这个精灵的爆炸者也
如果是这个大的爆炸的话,那么增加这个大的爆炸的处理者也
LE_FRAGMENT: // gibs and brass
CG_AddFragment( le );//将粒子等等东西
break;
case LE_MOVE_SCALE_FADE: // water bubbles
CG_AddMoveScaleFade( le );
根据这个来增加这个爆炸者也
增加局部的这个entity实体的处理者也
/*
------------------------------------------
得分板的处理
-----------------------------------------
*/
typedef struct {
int client;
int score;
int ping;
int time;
int scoreFlags;
int powerUps;
int accuracy;
int impressiveCount;
int excellentCount;
int guantletCount;
int defendCount;
int assistCount;
int captures;
qboolean perfect;
int team;
} score_t;
得分的这个情况,在quake3游戏中可以看到这个得分板的这个显示了者也
对于得分,乃是根据这个来分析获胜的情况了者也
得分板褪去等等的处理,
得分板的显示
在比赛过程之中按下了tab键值之后产生的
在一场游戏的结束后或这个你挂了之后会显示这个的
服务器的命令,包括了这个声音的处理
分析这个得分者也
分析这个组的信息者也
分析这个服务器信息者也
增加这个队友者也
地图重启
画出老的得分板
对于组队厮杀,我们需要进行这个对于队友的判断,
对于不同的游戏方式,这个最终的得分不同者也,组队夺标志,乃是这个夺下标志就是这个得分了,
死亡竞赛乃是杀死一个敌人取得一分的,
对于组队死亡竞赛,杀死对方的一个人,就是得分了,不同的游戏方式对应的这个得分不同
使用这个得分板来记录自己以及机器人的死亡情况
画出的分数
/*
在一场游戏完了以后,显示出来了这个第一,第二,第三名的模型显示出来
/*
-----------------------------------------------------------
动画的内容md3模型
-----------------------------------------------------------
*/
在cgame模块来写上了对于Md3模型的处理,和map地图的处理,
在渲染器部分,来进行这个将地图和模型,纹理来进行显示和加载的处理了
初始化了这个玩家的数目,物品数目后,我们加载这个表示这个物品的md3模型
bot的各种状态,包括了这个死亡,重生,受伤等等
对于这个md3模型的这个动画的处理了者也
animStringItem_t animStateStr[] =
{
{"RELAXED", -1}, //放松
{"QUERY", -1}, //查询
{"ALERT", -1}, //警惕
{"COMBAT", -1}, //战斗
{NULL, -1},
};
static animStringItem_t animMoveTypesStr[] =
{
{"** UNUSED **", -1},
{"IDLE", -1},
{"IDLECR", -1},
{"WALK", -1},
{"WALKBK", -1},
{"WALKCR", -1},
{"WALKCRBK", -1},
{"RUN", -1},
{"RUNBK", -1},
{"SWIM", -1},
{"SWIMBK", -1},
{"STRAFERIGHT", -1},
{"STRAFELEFT", -1},
{"TURNRIGHT", -1},
{"TURNLEFT", -1},
{"CLIMBUP", -1},
{"CLIMBDOWN", -1},
{"FALLEN", -1}, // DHM - Nerve :: dead, before limbo
{"PRONE", -1},
{"PRONEBK", -1},
{"IDLEPRONE", -1},
{"FLAILING", -1},
{NULL, -1},
};
/*
-----------------------------------------------
对应的状态和这个模型的动画了者也
动画,md3模型格式的动画标志
例如受伤,死亡,跳跃,等等,可以看出来md3模型的一些状态,根据这个状态来决定模型的动作
------------------------------------------------
*/
static animStringItem_t animEventTypesStr[] =
{
{"PAIN", -1},
{"DEATH", -1},
{"FIREWEAPON", -1},
{"FIREWEAPON2", -1},
{"JUMP", -1},
{"JUMPBK", -1},
{"LAND", -1},
{"DROPWEAPON", -1},
{"RAISEWEAPON", -1},
{"CLIMBMOUNT", -1},
{"CLIMBDISMOUNT", -1},
{"RELOAD", -1},
{"PICKUPGRENADE", -1},
{"KICKGRENADE", -1},
{"QUERY", -1},
{"INFORM_FRIENDLY_OF_ENEMY", -1},
{"KICK", -1},
{"REVIVE", -1},
{"FIRSTSIGHT", -1},
{"ROLL", -1},
{"FLIP", -1},
{"DIVE", -1},
{"PRONE_TO_CROUCH", -1},
{"BULLETIMPACT", -1},
{"INSPECTSOUND", -1},
{"SECONDLIFE", -1},
{"DO_ALT_WEAPON_MODE", -1},
{"UNDO_ALT_WEAPON_MODE", -1},
{"DO_ALT_WEAPON_MODE_PRONE", -1},
{"UNDO_ALT_WEAPON_MODE_PRONE", -1},
{"FIREWEAPONPRONE", -1},
{"FIREWEAPON2PRONE", -1},
{"RAISEWEAPONPRONE", -1},
{"RELOADPRONE", -1},
{"TALK", -1},
{"NOPOWER", -1},
{NULL, -1},
};
animStringItem_t animBodyPartsStr[] =
{
{"** UNUSED **", -1},
{"LEGS", -1},
{"TORSO", -1},
{"BOTH", -1},
{NULL, -1},
};
这个触发器和这个触动的这个事件了
对于这个信息的这个处理了
怪物死亡的时候发出声音
传送门的模型,
id的天空乃是使用的brush上面粘贴了者也这个贴图来来进行处理的者也
加载上了这个cgame.dll或者cgame.qvm等等的处理了
// load the dll or bytecode
if ( cl_connectedToPureServer != 0 ) {
// if sv_pure is set we only allow qvms to be loaded
interpret = VMI_COMPILED;
}
else {
interpret = Cvar_VariableValue( "vm_cgame" );
}
cgvm = VM_Create( "cgame", CL_CgameSystemCalls, interpret ); //调用虚拟机创建游戏
if ( !cgvm ) {
Com_Error( ERR_DROP, "VM_Create on cgame failed" );
}
cls.state = CA_LOADING;
// init for this gamestate 初始化游戏状态。
// use the lastExecutedServerCommand instead of the serverCommandSequence
// otherwise server commands sent just before a gamestate are dropped
VM_Call( cgvm, CG_INIT, clc.serverMessageSequence, clc.lastExecutedServerCommand, clc.clientNum );
// we will send a usercmd this frame, which
// will cause the server to send us the first snapshot
cls.state = CA_PRIMED;
以下乃是控制台这些命令来调用的函数的名字,控制台命令对应的cgame 模块的函数
{ "testgun", CG_TestGun_f },
测试枪支的位置的
{ "testmodel", CG_TestModel_f },
测试模型的位置的
{ "nextframe", CG_TestModelNextFrame_f },
{ "prevframe", CG_TestModelPrevFrame_f },
{ "nextskin", CG_TestModelNextSkin_f },
{ "prevskin", CG_TestModelPrevSkin_f },
{ "viewpos", CG_Viewpos_f },
{ "+scores", CG_ScoresDown_f },
{ "-scores", CG_ScoresUp_f },
{ "+zoom", CG_ZoomDown_f },
{ "-zoom", CG_ZoomUp_f },
{ "sizeup", CG_SizeUp_f },
{ "sizedown", CG_SizeDown_f },
上一个武器,对应的调用下一个武器的函数
{ "weapnext", CG_NextWeapon_f },
{ "weapprev", CG_PrevWeapon_f },
{ "weapon", CG_Weapon_f },
{ "tell_target", CG_TellTarget_f },
{ "tell_attacker", CG_TellAttacker_f },
{ "vtell_target", CG_VoiceTellTarget_f },
{ "vtell_attacker", CG_VoiceTellAttacker_f },
{ "tcmd", CG_TargetCommand_f },
#ifdef MISSIONPACK // 以下的函数用在quake3 team竞技场
{ "loadhud", CG_LoadHud_f },
{ "nextTeamMember", CG_NextTeamMember_f },
{ "prevTeamMember", CG_PrevTeamMember_f },
{ "nextOrder", CG_NextOrder_f },
{ "confirmOrder", CG_ConfirmOrder_f },
{ "denyOrder", CG_DenyOrder_f },
{ "taskOffense", CG_TaskOffense_f },
{ "taskDefense", CG_TaskDefense_f },
{ "taskPatrol", CG_TaskPatrol_f },
{ "taskCamp", CG_TaskCamp_f },
{ "taskFollow", CG_TaskFollow_f },
{ "taskRetrieve", CG_TaskRetrieve_f },
{ "taskEscort", CG_TaskEscort_f },
{ "taskSuicide", CG_TaskSuicide_f },
{ "taskOwnFlag", CG_TaskOwnFlag_f },
{ "tauntKillInsult", CG_TauntKillInsult_f },
{ "tauntPraise", CG_TauntPraise_f },
{ "tauntTaunt", CG_TauntTaunt_f },
{ "tauntDeathInsult", CG_TauntDeathInsult_f },
{ "tauntGauntlet", CG_TauntGauntlet_f },
{ "spWin", CG_spWin_f },
{ "spLose", CG_spLose_f },
{ "scoresDown", CG_scrollScoresDown_f },
{ "scoresUp", CG_scrollScoresUp_f },
#endif
{ "startOrbit", CG_StartOrbit_f },
//{ "camera", CG_Camera_f },
{ "loaddeferred", CG_LoadDeferredPlayers }
控制台的命令了者也