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)
0xc001 (十六进制 hexadecimal)
b)字符型
"abcd" (字符串string)
'abcd' (标记字符串 tagged string)
你可以在控制台试试:
echo("abcd");
echo('abcd'); 有什区别
再试一下一个有意思的语句:
echo("1"+"2");
会输出:3 而不是把2个字符串连接,连接是用 @ 来操作,如:
echo("1" @ "2");
输出:12
这就是torque的script脚本的灵活之处,
更多的字符连接符:
@ 连接两个字符串
TAB 两个字符串间加入tab
SPC 两个字符串间加入一个空格
NL 两个字符串间加入一个加车(换行)
注意:这些操作符的英文必须是大写。
如:echo("abcd" NL "CDEF");
会输出:
abcd
CDEF
格式化字符操作:
/n (newline) 新行
/r (carriage return) 回车
/t (tab)
/c0.../c9 (colorize subsequent text) 字体色
/cr (reset to default color) 回到默认色
/cp (push current color on color stack)把当前色设进颜色堆栈 未知使用方法
/co (pop color from color stack) 从颜色堆栈中取色 未知使用方法
/xhh (two digit hex value ASCII code) 这个我还不懂。。
// (backslash) 注解
较常用的是字符的颜色处理:
原则上是对后面的字符产生影响,直到一个新的字体色操作符出现,但只对当前行字符产生影响,并不会影响默认字体色。
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;
你试下
echo($a);
echo($a[0]);
输出的是各自代表的值。
更有趣的是,torque脚本中,数组可以用如下方法指向:
接着上例,你试试:
echo($a0);
输出的是$a[0]的值,同理,如果要输出$a[0,0],可以用如下方法:
echo($a0_0);
再次可见,torque的脚本是具有相当的灵活性
e)矢量(vectors)
格式如:"1.0 1.0 1.0 1.0"
矢量是引擎中一个应用很广的变量类型,在3D坐标,动力,粒子,声效等等都有相应的应用。
5)操作符
这方面与C++很相似,所以不花篇幅陈述。可以参见script的编程指南
如 a++ a-- 的用法都是与c++语言的用法一样的。
字符串对比操作:
$= 等于
!$= 不等于
如:echo("abc" $="abc");
输出1
echo("abc" !$="cde");
输出1
6)控制语句
与c++的基本相同
a) if -then -else 判断语句
if(表达式)
{
语句1;
} else
{
语句2;
}
b)switch
switch(表达式)
{
case 值1:
语句1;
break;
case 值2:
语句2;
break;
...
case 值N:
语句N;
break;
default:
默认执行语句;
};
注意 break; 必不可少
c)while 循环语句
while(表达式)
{
语句;
}
7)功能模块 function
与c++也基本相同,定义方法
function 功能模块名([参数0],...,[参数n])
{
语句;
[return 返回值;] 可选
}
8)物体定义 objects
介绍了一些基本的知识,这里开始进入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已含有的,可参看torque的datablock附表。
内置属性1=初始化值1; //可选,不选则取默认值
内置属性2=初始化值2;
...
自定义属性1=初始化值1; //可选,自定义属性只能在script中应用,并不影响引擎的内置属性
自定义属性2=初始化值2;
...
}; //这个 ;不可少.
注:返回的句柄在客户端是唯一值,但网络下的ID又不同,所以一个物体存在2个ID,一个是本地ID,一个是网络ID,网络ID是
整个游戏网络中唯一的ID号,进行网络游戏编程时应注意,关于网络ID的获得方法,以后再作说明。