现在的位置: 首页 > 综合 > 正文

Torque引擎系列之脚本入门

2012年07月10日 ⁄ 综合 ⁄ 共 3835字 ⁄ 字号 评论关闭

本人接触TGE引擎已差不多有两年时间,TGE是国外的一款相当不错游戏引擎。价格低廉(只需99 dollar)、支持脚本、并内建GUI编辑器、粒子编辑器、场景编辑器。最致命的缺陷是在网络部分,只能支持100多个客户端,所以要开发多人在线游戏需要更换它的网络部分。不过你要是想开发一个单机或者是局域网游戏的话,TGE引擎确实是个不错的选择。以后我们分几篇文章介绍一下Torque引擎,包括脚本、编辑器的使用、以及引擎部分。

第一部分:脚本入门
************************
1
)打开控制台(console)

 运行torquedemo.exe进入主界面或游戏后,按 ~ 键(不用按shift,其实是`键)激活控制台是一个调试程序的好地方。

2)试一下最简单命令 echo()

 在控制台键入echo("hello!");  (注意必须加; 就象c++一样)可以看到console窗口就立即显示 hello!别小看echo(),有时为了调试脚本程序,在适当的地方加入echo(),显示有关变量的值,可以监测程序是否正确。使用echo()时,如要输入多行语句,只须连续输入即可,torque会根据 ;来分行执行如:$a=1;echo($a);输出:1
3
torque的脚本script的特点:

a) 
无须预定义,即开即用。 b) 变量类型灵活性,如 "12" 12 是一样的c) 变理大小写不敏感,%a %A 是一样的d) c++类似,每个语名均须以 ; 作为结束标记
4
)变量,torque脚本中,$表示全局变量,%表示局部变量表示法: $a 为全局变量a (在网络中,全局变量只表示在本客户端的全局变量,并不是整个网络)%b 为局部变量b (一般用于function中)

变量类型:a)数字型 1234  (整数interger)1.234  (浮点数floation point) 1234e-3 (科学记数scientific notation   

b)字符型 "abcd"  (字符串string)  'abcd'  (标记字符串 tagged string) 
再试一下一个有意思的语句:echo("1"+"2");会输出:3  而不是把2个字符串连接,连接是用 @ 来操作,如: echo("1" @ "2"); 输出:12      这就是torquescript脚本的灵活之处, 更多的字符连接符: @   连接两个字符串TAB  两个字符串间加入tabSPC  两个字符串间加入一个空格 NL   两个字符串间加入一个加车(换行)注意:这些操作符的英文必须是大写。如:echo("abcd" NL "CDEF");会输出:
abcd CDEF               
较常用的是字符的颜色处理:

原则上是对后面的字符产生影响,直到一个新的字体色操作符出现,但只对当前行字符产生影响,并不会影响默认字体色。
echo("/c2hello!/c0hello!")
;前一个hello!会显示红色,后一个hello!会显示正常的黑色。

C)逻辑型 :与其它语言一样,torque也只有两个值 true (1) false (0)

d)数组(arrays)表示法:$AA[n]  一维数组 $AA[M,N] 多维数组 $AA[M_N] 多维数组的另一种表示法, 变量与数组的名字可以相同,但值并不会产和影响:$a=2;$a[0]=3;更有趣的是,torque脚本中,数组可以用如下方法指向:接着上例,你试试:echo($a0);输出的是$a[0]的值,同理,如果要输出$a[0,0],可以用如下方法:echo($a0_0);再次可见,torque的脚本是具有相当的灵活性。
d)
矢量(vectors):格式如:"1.0 1.0 1.0 1.0" 矢量是引擎中一个应用很广的变量类型,在3D坐标,动力,粒子,声效等等都有相应的应用。
5
)操作符,这方面与C++很相似 

6)控制语句,c++的基本相同

7)功能模块 function              
function 功能模块名([参数0],...,[参数n]) 
{
     
语句
;
    [return
返回值;]   可选


8
)物体定义,
介绍了一些基本的知识,这里开始进入torque特有的语法了。torque中,所有项目都是物体,并且所有游戏中的物体都可以访问,如人物,汽车,场景中的物体。且都可以用脚本进行访问,而物体的属性是在引擎中定义的。

我们看一个脚本中的代码(节选自server/scripts/player.cs

datablock PlayerData(PlayerBody)
{
   renderFirstPerson = false;
   emap = true;
  
   className = Armor;
   shapeFile = "~/data/shapes/player/player.dts";
   cameraMaxDist = 3;
   computeCRC = true;
 
   canObserve = true;
   cmdCategory = "Clients";

   cameraDefaultFov = 90.0;
   cameraMinFov = 5.0;
   cameraMaxFov = 120.0;
  
   debrisShapeName = "~/data/shapes/player/debris_player.dts";
   debris = playerDebris;

  ...
};

datablock的作用是定义物体的有关属性。

这里就是定义了游戏人的人物的有关属性,包括视角定义,3D文件(dts),等等,

再在server/scripts/game.cs 中载入:
  ...
   exec("./crossbow.cs");
   exec("./player.cs");  //
载入player.cs中定义的物体
   exec("./chimneyfire.cs");
   exec("./aiPlayer.cs"); 
  
   ...

载入只是预载入内存,并未真正创建,现在看一下在哪里创建了人物player

game.cs中,可找到有关功能模块:

function GameConnection::createPlayer(%this, %spawnPoint)
{
   if (%this.player > 0)  {
      // The client should not have a player currently
      // assigned.  Assigning a new one could result in
      // a player ghost.
      error( "Attempting to create an angus ghost!" );
   }

   // Create the player object  就是这里创建了player这个物体,并返回名柄给%player
   %player = new Player() {
      dataBlock = PlayerBody;
      client = %this;
   };
   MissionCleanup.add(%player);  //
在场景中加入

   // Player setup...
   %player.setTransform(%spawnPoint);   //
设定随机出现的地点,地点在场景编辑器中定义,并在function pickSpawnPoint()功能中产生随机点
   %player.setShapeName(%this.name);
  
   // Starting equipment
   %player.setInventory(Crossbow,1);   //
初始时的武器设置
   %player.setInventory(CrossbowAmmo,10);  //
初始时的弹药设置
   %player.mountImage(CrossbowImage,0);  //
设置武器在人物的装配点 0表示mount0,1表示装在mount1,由此类推。

   // Update the camera to start with the player
   %this.camera.setTransform(%player.getEyeTransform());  //
设置视角方式

   // Give the client control of the player   //把控制交给player这个物体
   %this.player = %player;
   %this.setControlObject(%player);
}

总结一下,创建物体objcect的方法是:

%ver=new 物体类型(名称) %ver 是返回的句柄,是一个整数,是游戏中的客户端唯一值,相当于物体ID
{
 datablock=datablock
定义; //这是必须的,datablock可以是自定义的,或是torque已含有的,可参看torquedatablock附表。

 内置属性1=初始化值1 //可选,不选则取默认值
 
内置属性2=初始化值2

 ...

 自定义属性1=初始化值1 //可选,自定义属性只能在script中应用,并不影响引擎的内置属性
 
自定义属性2=初始化值2

 ...

};  //这个 ;不可少.
注:返回的句柄在客户端是唯一值,但网络下的ID又不同,所以一个物体存在2ID,一个是本地ID,一个是网络ID,网络ID
整个游戏网络中唯一的ID号,进行网络游戏编程时应注意,关于网络ID的获得方法,以后再作说明。

抱歉!评论已关闭.