发信人: holmes()
整理人: Airflow(1999-11-26 11:57:50), 站内信件
|
相信大家在《游戏天地》和其他的兄弟媒体上已经见到了不少“鼓吹” QUAKEC的文章和介绍了吧?可恨的是都只是“鼓吹”,朋友们还是不知道 QUAKEC到底是什么东西。于是阿猪又找到了我——每次他找我的时候只有 一件事:缺稿子了,从来没有第二件事,嘿!真是没有办法。俗话道:当 官的一张嘴,下面的跑断腿。俺举起放大镜满世界猛找,翻译、实验…… 终于在两个星期后的今天开始给大家介绍这个电脑游戏史上划时代的构想 ——QUAKEC的语法和一些实际应用的经验。 QUAKEC说明文件和其他所有的软件规范一样,都是经过了一个个版本 的不断改进和演变的。到现在已经是3.4版了,并且还在不断地更新。到 本文发稿的时候为止,已经有消息说4.0版已经要出来了。有意思的是, 对QUKAEC的改进贡献最大的并不是来自id Software,而是一些超级发烧 友的义务劳动。这还有另外一层特别的意义。在我得到的大多数关于 QUAKEC的文档里往往都有大意如下的一段话:此文档是按照我们自己对于 《QUAKE》文件结构的理解来编写的,我们无法保证在这里所有的一切都 是正确的。我们不对因此而引起的一切后果负责,别说我没警告过你! 怎么样?是不是挺吓人的?但既然他们都这么说,我也就只好也先给 大家打个招呼了。不过大家放心,我在这里所介绍的,都是笔者自己动手 实践过的。没有试过的……至少我会给大家打声招呼。好了,不多说废话 了,我们一起来进入QUAKEC的世界吧! 首先我们要有一些准备工作。因为要想熟练地用QUAKEC,就必须要知 道一些关于3D建模方面的知识。另外还要注意,QUAKEC只能用于已经注册 过的版本上。最后——当然您要能懂得一点C语言的基本知识。在本文中 所提到的所有工具都将放在《游戏天地》的配套光盘里。
下面是一些专用字的说明:
0xABCD : 十六进制数 char : 8位有符号整数 u_char : 8位无符号整数(字节) short : 16位有符号整数 u_short : 16位无符号整数 long : 32位有符号整数 u_long : 32位无符号整数 float: 32位单精度实数(浮点)
第一讲 QUAKE的地图
谈到QUAKE的地图编辑,内容实在是太多了。笔者在这里显然不可能 介绍得很全面(其实QUAKE的地图编辑本身就可以开一个讲座了),这里 涉及的都是一些和QUAKEC有关的部分。至少,你辛辛苦苦做出来的地图 还是要通过QUKAEC来加到游戏里去啊。
一 关于地图的一些基本信息
1、坐标系统
《QUAKE》中使用了标准的“左手系”坐标,如图所表示。“左手 ”的意思是指你把左手半握拳,大拇指树起来的话,大拇指就表示了Z 轴,其余四个手指是从X轴指向Y轴。 有一些物体当然是摆放得比较随意,比较斜一点,这时就要用到 一个“角度”的概念了。《QUAKE》中的角度是如下设定的:
0-359: 普通角度 -1: 上 -2: 下
2、刷子(Brush)
刷子是《QUAKE》的地图中两个最重要的概念之一。每一个刷子都 定义了一个单独的区域。每一个区域都被看成是四个以上相互交叉的 面形成的。而每一个面又是由不在同一直线上的三个点定义的。注意 的是这三个点必须是按照顺时针的顺序排列。不过笔者至今没有弄清 楚为什么这些老外要把它叫做“BRUSH”。每一个刷子的声明 (Statement。注意!我们开始涉及到C语言的概念了!)都应是如下 形式:
{ ( 128 0 0 ) ( 128 1 0 ) ( 128 0 1 ) GROUND1_6 0 0 0 1.0 1.0 ( 256 0 0 ) ( 256 0 1 ) ( 256 1 0 ) GROUND1_6 0 0 0 1.0 1.0 ( 0 128 0 ) ( 0 128 1 ) ( 1 128 0 ) GROUND1_6 0 0 0 1.0 1.0 ( 0 384 0 ) ( 1 384 0 ) ( 0 384 1 ) GROUND1_6 0 0 0 1.0 1.0 ( 0 0 64 ) ( 1 0 64 ) ( 0 1 64 ) GROUND1_6 0 0 0 1.0 1.0 ( 0 0 128 ) ( 0 1 128 ) ( 1 0 128 ) GROUND1_6 0 0 0 1.0 1.0 }
也许您第一次看到它们的时候会觉得有些脑子发晕,反正我是。其 实这一大堆东西就是定义了一个从点(128,128,64)到点(256,384, 268)的长方体。每一行的意思如下:
128 0 0 128 1 0 128 0 1 GROUND1_6 0 0 0 1.0 1.0 第一点 第二点 第三点 材质 x_off y_off 旋转角度 X轴范围 Y轴范围
解释:
第一点、第二点和第三点:这三点定义了一个面,所以当然不能是 在同一条直线上。每一个面只能被定义一次。
材质:所使用MIP材质的名字(MIP将会在以后讲到)
x_off:材质的X轴偏移,必须是16的倍数
y_off:材质的Y轴偏移,同样必须是16的倍数
旋转角度:材质旋转的角度,单位是度。
X轴范围:材质在X轴方向上的长度范围
Y轴范围:材质在Y轴方向上的长度范围
3、*.MAP文件基础知识
其实MAP文件的结构挺简单的,它就是一个文本文件。所有的 《QUAKE》编辑器都应该同时支持UNIX和DOS两种文本格式。 MAP文件是对《QUAKE》的关卡建造格式的说明。建议在改动 时尽量修改MAP文件,因为所有的id Software发布的工具都是针 对MAP文件做改动的。注意其实MAP文件都是一组“未编译”的数 据,只有在它转换为*.BSP文件之后才可以被《QUAKE》所认识。 转换是用专门的BSP转换工具来完成的,比如QBSP.exe。另外,MAP 文件还要由专门的光影处理器处理过,这样《QUAKE》才能计算出 在某个地方的光线强度。否则的话在游戏中会以最强光线显示这 部分地图。最后,为了使此地图在游戏中运行时速度更快和不出 错,还要用VIS这样的工具进行处理。总之,《QUAKE》总的地图 设计是一件非常费时间的事,比当年设计《DOOM》的地图要复杂 得多,即使你现在用的机器比那时候快了很多,但是可能你花费 的时间会更多。
MAP文件通常的结构如下:
{ entity { brush (optional) } } ...
在MAP文件中可以加进注释,方法和C++中是一样的,用“//” 表示后面是注释的内容。
在MAP文件中可以使用很多种实体(entity)和刷子的组合。 但是所有的MAP文件都要有一个worldspawn的实体,它通常都是 文件的第一个入口,里面定义了所有这个关卡中常用的刷子。每 一个MAP文件中只能有一个worldspawn实体。其构造如下: "classname" "worldspawn" // 表示这是建造本关卡的QUAKEC函数开始! "wad" "DIRPATH" // 表示使用哪一个图形文件,即*.WAD文件 "message" "TITLE" // 本关的名字 "worldtype" "#" // 本关的类型,0表示为中世纪的,1表示古巴比伦式 (这是基本模式), 2表示金属 "sounds" "#" // 决定放哪一首CD音轨
下面是一个简单的MAP文件示例:
{ "sounds" "1" "classname" "worldspawn" "wad" "/gfx/base.wad"
"worldtype" "0" { ( 128 0 0 ) ( 128 1 0 ) ( 128 0 1 ) GROUND1_6 0 0 0 1.0 1.0 ( 256 0 0 ) ( 256 0 1 ) ( 256 1 0 ) GROUND1_6 0 0 0 1.0 1.0 ( 0 128 0 ) ( 0 128 1 ) ( 1 128 0 ) GROUND1_6 0 0 0 1.0 1.0 ( 0 384 0 ) ( 1 384 0 ) ( 0 384 1 ) GROUND1_6 0 0 0 1.0 1.0 ( 0 0 64 ) ( 1 0 64 ) ( 0 1 64 ) GROUND1_6 0 0 0 1.0 1.0 ( 0 0 128 ) ( 0 1 128 ) ( 1 0 128 ) GROUND1_6 0 0 0 1.0 1.0 } } { "classname" "info_player_start" "origin" "256 384 160" }
你可以看到,所有的刷子都包括在实物里了。其实MAP文件中 最复杂的部分是在于实物,这也是我们下面要进一步讨论的。
二、实物(entity)的基本知识
1、基本结构
实物是在MAP文件中另外一个重要的组成部分。实物当然可以 理解为一个东西,但是不完全是。有时它是一个触发的机关,有时 它是活动的暗门。一个实物的结构通常如下:
{ "classname" "light" "origin" "0 128 64" "light" "255" }
这就是普通的实物结构的声明。“普通”的意思是说它还没有 和刷子结构联系起来。当两者联系起来之后的声明形式如下:
{ "classname" "func_door" "angle" "0" "speed" "16" "targetname" "t1" "sounds" "1" "wait" "16" { ( 128 0 0 ) ( 128 1 0 ) ( 128 0 1 ) GROUND1_6 0 0 0 1.0 1.0 ( 256 0 0 ) ( 256 0 1 ) ( 256 1 0 ) GROUND1_6 0 0 0 1.0 1.0 ( 0 128 0 ) ( 0 128 1 ) ( 1 128 0 ) GROUND1_6 0 0 0 1.0 1.0 ( 0 384 0 ) ( 1 384 0 ) ( 0 384 1 ) GROUND1_6 0 0 0 1.0 1.0 ( 0 0 64 ) ( 1 0 64 ) ( 0 1 64 ) GROUND1_6 0 0 0 1.0 1.0 ( 0 0 128 ) ( 0 1 128 ) ( 1 0 128 ) GROUND1_6 0 0 0 1.0 1.0 } }
注意,和实物相结合的刷子有一个“原始”标签,它是用来对在关 卡中的位置作一些偏移。
在接下来的部分中,我将给大家介绍一下实物的结构及其中的各个 选项。各个入口(entry)其实可以按任意次序排列,另外还有很多的 可选项。
2、spawnflag标签
spawnflag标签是一个附加的标签,就是说即使一个实体中已经有了 一个原始标签后也可以再加上一个SPAWNFLAG标签。它是用来说明一些额 外的属性:
1 - 额外的生命或弹药(比如生命超过100等) 2 - 超高生命 256 - 表示普通难度以上 512 - 困难难度以上 1792 - 这个值仅仅在死亡模式中才使用。
3、实物的语法
在《QUAKE》中,实物(entity)可以定义怪兽、物品, 另外还可以定义即将发生某种事件的位置。它们其实和DOOM 中的THINGS和LINEDEF这两种类型相对应。 实物的定义当中包括了一系列的项目:此实物是什么东 西,它什么时候出现,在什么位置出现等。每一条项目的后 面都跟有一些对它各方面的详细规定。每一个实物的定义都 有一个“类名(class name),类名就是在QUAKEC中的函数 名,它与“代码堆(code lump)”有很密切的关系。在对它 们作出说明的时候,我用到了“特性(specfics)”和“内 容”这两个词,也许他们并不是很确切,不过id并没有规定 他们叫什么,而且国外的玩家在说明他们的时候用的两个单 词也不是很容易恰当地翻译过来,就用他们吧!
特 性 内 容 说 明
"classname" "name" // 定义实物的类型,是必须要求的选项 "origin" "X Y Z" // 定义其在空间中开始放置的位置坐标 "angle" "#" // 此实物面对的方向或是移动的方向,有时用角度来表示 "light" "#" // 这是在光影类名中要使用的数值 "target" "t#" // 对应一个目标名 "targetname" "t#" // 就象是DOOM中的linedef标签 "killtarget" "#" // 当此角色击中你的时候带给你的伤害力 "spawnflags" "#" // 用来说明一个非缺省的实物 "style" "#" // 同上,是用来说明一个非缺省的实物 "message" "string" // 当事件被触发的时候显示的信息,用/n表示信息结束 "mangle" "X Y Z" // 指出中断镜头的视角 {BRUSH INFO} // 这是在描述触发事件、门或是平台等的实物中加进的刷子,它 用一对括号圈起来
下面是仅在描述游戏中的怪物角色的实物使用的特性:
"speed" "#" // 此角色的移动速度 "wait" "#" // 在反复移动间的停顿时间,用秒或十分之几表示 "lip" "#" // 此特性和调整角色的开始位置有关 "dmg" "#" // 表示当此角色击中你的时候 -- E-mail: [email protected]
※ 来源:·广州网易 BBS bbs.nease.net·[FROM: 202.101.119.185]
|
|