发信人: holmes() 
整理人: Airflow(1999-11-26 11:57:50), 站内信件
 | 
 
 
QUAKEC的语法
  牋牋牋牋本教程又和大家见面了!上期的教程出了之后,得到了一些《QUAKE》玩家 的意 见,另外自己也反省了一下,看来是有了一个误区:就是我还没有把最基本的语法、 专用名词等说明就想直接给大家介绍在实际设计中的应用了。其实我的本意是想 QUAKEC中的语法和C相差不多,有区别的地方就直接在用到的时候再提一下就行了。 但是看来这样做的条理性比较差,而且不少玩家抱怨说本来对C就不熟或根本就没 学过……好吧,我投降!笔者还是决定从这期开始,尽量简洁明了地把有关 QUAKEC语言的基本语法给大家作一个介绍。不过那样的话,篇幅就比原来预料的 更长了,实难洗脱混稿费之嫌……
  一、注释、名称和类型
  注释:
  和C++中的注释方式一样,有下面两种形式: 
  // 后面跟注释内容,直到下一行开始 或 /*注释块*/
  名称:
  在QUAKEC中的各种变量、函数或域等的名称必须满足以下条件: 牋牋牋牋最多由64个字母组成,开始第一个字母必须是A-Z、a-z或_,后面可以 跟0-9的数字。
  新类型的定义:
  牋牋牋牋关于这个问题要告诉大家一个坏消息:在QUAKEC中是不允许你自己定 义新的类型的。比如说你不能定义一个叫ammo的浮点变量,这个名字是专 用的,它就是用来表示弹药的。
  结构和对象的定义:
  牋牋牋牋在C或C++中定义一个结构或对象是很方便的,他们用来在一个结构中 放置一组相互有关联的信息。比如,你可以用一个结构来存放玩家所有武 器的弹药,因为显然它们是有着明显联系的。 但是要注意的是,虽然实物(entity)和矢量(vector)很明显都属 于结构这一类,但是在QUAKEC中不允许自行建立新的实物和矢量。不过你 可以按自己的一些要求对现有的实物类型进行修改。
  二、常量和变量
  变量的定义:
  通常对于变量的定义采用如下形式:
  类型 变量1,变量2;
  其中“类型”是在QUAKEC中已经规定的变量中的一种。
  变量范围
  牋牋牋牋共有两种变量范围。缺省情况下所有的变量都是“全局(global)” 型的,它们可以被别的函数访问,并且由所有的函数共同享有(当然包括 了给予访问权的所有网络客户)。 牋牋牋牋另外一种变量范围是“局部(local)型”,定义方法是在函数内部 用“local”关键字在变量类型前进行定义,这种变量仅仅在函数内部可 见(注意它们将被分配到堆栈里)。 牋牋牋牋另外函数的参数也是被当作局部变量来看待的,它们仅在函数内部 可见,但它们的值可以改变。
  常量的定义:
  对于一个全局变量,如果初始化时给它赋了一个值,则将被当作一个常量。 常量定义的通常方式为:
  类型 变量1 = 值;
  牋牋牋牋注意,虽然看起来这象是一个变量的定义,但是当我们在这个变量初 始化的时候赋一个初值,则它的意义就完全改变了。常量没有象变量那样 有一个专门的内存地址进行存放,而且它们在游戏存盘的时候也不会写进 存盘文件里去(只有通常的变量才写进去)。 牋牋牋牋在赋了常量的初值后,就不能再进行改动了,如果你一定想给常量一 个新的值……这就是故障发生的原因!
  三、 操作符
  逻辑操作符:
  ! // 逻辑非 && // 逻辑与 || // 逻辑或
  这里需要注意一点,在if()中的条件表达式里往往有着两个或更多的逻辑 判断句。在这种情况下,所有的逻辑判断式都要先于条件判定之前就得出 结果(和BASIC中的习惯一样,而不是C中的习惯!)
  比较操作符:
  <= < >= >  == // 等于 != // 不等于,这两个符号都和C中一样
  浮点数和整数运算操作符:
  * / - +
  下面两个运算符是对于整数的二进制位:
  & // 位与 | // 位或
  它们同样也可以运用与浮点数的运算,所以使用这两个运算符的时候往往 都带有一些“位”的因素在里面。
  四、函数的定义
  普通函数
  通常一个函数的定义结构如下:
  type (type param1, typeparam2, ... ) function = { ... code ... return expression; };
  说明: 1、在每一行的最后一定有一个“;”号。 2、函数返回表达式可以有多个,并且可以放在函数的任意位置。 3、如果返回值为空(void),则返回表达式可以省略。
  下面是几个例子:
  void () think = {...}; entity () FindTarget = {...}; void(vector destination, float speed, void() callback) SUB_CalcMove = {...};
  调用函数:
  在QUAKEC中调用函数的方式如下: 函数名( 参数1,参数2,... ) 注意参数最多为8个。
  函数声明:
  如果你想在定义一个函数之前就使用它,则必须首先进行声明,否则 QUAKEC的编译程序无法使用这个函数。
  下面是声明一个函数的形式:
  type (type param1, typeparam2, ... ) function;
  桢函数(frame function)的定义: 桢函数(也叫状态函数States)是一种特殊的函数,它可以简化游戏中 各种角色模型运动时桢的定义。
  下面是一个例子:
  void() framename = [$framenum, nextthink] { ...code...};
  上面这个定义等同于下面的函数定义:
  void() framename = { self.frame= $framenum; // the model frame to displayed self.nextthink = time + 0.1; // next frame happens in 1/10 of second self.think = nextthink; // the function to call at the next frame ...code... };
  五、循环和条件
  循环结构:
  1、 if( expression ) { statements } else { statements }
  2、 while( expression ) { statements }
  或  do {  statements }while( expression )
  QUAKE-C 中的基本类型
  一、简单类型
  1、空(void)
  牋牋牋牋这是一个“空”的结果,主要是用在函数的定义中(比如一个不返回 值的函数)
  2、浮点
  牋牋牋牋浮点当然就是表示一个小数点浮动的值,不过布尔变量(TRUE和FALSE) 也是用浮点方式存储的,浮点中其实还包括了整数和位标志。
  有效的表达式: 12 1.6 0.5 -100  无效的表达式: .5
  注意在QUAKEC中空格是非常重要的,比如“a-5”这个表达式在QUAKEC 中会出错,因为程序首先把表达式处理成“a”,然后是“-5”,所以 它就不认识了。正确的写法是“a - 5"。
  3、矢量
  牋牋牋牋一个矢量由三个浮点坐标构成。它用来表示位置或是在3D空间中的 方向。有效的表达式是:‘0 0 0’或‘20.5 -10 0.00001’ 矢量一定是用单引号括起来,不要用双引号,你用的话程序并不会 说你出错,仍然可以进行下去,但是双引号里的内容都将被认为是字符 串。在定义了一个矢量vector1后,此矢量的x、y和z轴坐标分别可用 vector1_x、vector1_y和vector1_z来表示。
  4、字符串
  牋牋牋牋字符串在QUAKEC中主要是用来表示文件名和传递给玩家的一些信息。 比如:: "maps/jrwiz1.bsp" 或"ouch!\n" ,用 \n 表示换行。字符串 不能象变量那样在程序中进行修改或是把两个字符串连起来(在C中是 可以的),因为它们是用固定的内存地址存放的。
  5、实体(entity)
  实体是指游戏中的所有物品、玩家和怪物。他是一个结构,由不同 的部分组成。
  二、域
  1、域的定义
  牋牋牋牋与其他的类型相反,实体是由许多部分组成的。每一个部分都有自 己的名字和类型,以把自己和实体中的其他部分区别开来。每一个部分 就叫一个域。有些域并不表示一个确定的值,它们用来存放在特定条件 下执行的某个函数。
  2、建立新的域
  牋牋牋牋在实体已有类型上进行扩展只有一种方法,就是在实体结构的最后 加上新的域。只要定义一个新的域就行了。
  .类型 域名;
  比如,你想在游戏中加进去一种抛石器,则肯定要为游戏中每一位 玩家都设立一个存储石块的域,比如在代码中加进下面这句话:
  .float ammo_sling;
  这样游戏中的每一个相关的实体都将具有一个叫ammo_sling的域,特别 是表示玩家的实体。
  下面是所有可能新定义的实体域及其类型:
  .float field_name; .string field_name; .vector field_name; .entity field_name;
  牋牋牋牋另外你并不需要专门把这些定义一起放到一个特定的地方,你可以把它 们放到源代码中的任何位置。
  3、对类型作的改动
  牋牋牋牋QUAKEC的编译器工作时读的第一个文件是defs.qc,它里面有许多实体 和域的定义。这些定义是极其严格的,所以我们最好不要去动这个文件。
  三、QUAKEC的角色(model)定义
  牋牋牋牋使用QUAKEC的代码我们不仅可以定义实体的行为,还可以定义游戏 中角色(model)的各种动作和行为。游戏中的角色包括了怪物、玩家 和一些特殊的运动的东西,角色的数据文件是*.mdl。 角色的各种属性在表示时都要在句子的最前面加上一个“$”符号。 它们不能放在函数定义的内部。有些句子连QUAKEC的编译器都不能直接 解释,但是它们对于角色产生器工作时很有帮助。
  角色的名字:
  $modelname name
  其中“name” 就是实体中定义的模型文件的名字,比如:
  $name armor
  directory
  $cd dir
  这句话说明了你的模型文件(model file)存放的位置,比如:
  $cd /evil/models/armor.
  特殊的动画标签:
  $flags flag_value
  注意QUAKEC并不对这个域解释,但是它对建立角色模型的程序很有帮助。 -- E-mail: [email protected]
  ※ 来源:·广州网易 BBS bbs.nease.net·[FROM: 202.101.119.185]
  | 
 
 
 |