Chinaunix首页 | 论坛 | 博客
  • 博客访问: 71938
  • 博文数量: 14
  • 博客积分: 570
  • 博客等级: 中士
  • 技术积分: 153
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-27 17:53
文章分类

全部博文(14)

文章存档

2009年(6)

2008年(8)

我的朋友

分类:

2009-06-17 00:34:38

TorqueScript中的对象,是一种很奇妙的东西,下面慢慢道来。
 
在Torque中,游戏世界中的任何东西都是“对象”,而且所有的“对象”都可以通过script来访问。比如玩家(Player),物品(Item),尽管他们都是在C++中定义的,但是脚本也可以访问。
 
TorqueScript中对象的定义语法:
 

%var = new ObjectType(Name : CopySource, arg0, ..., argn)

{

[existing_field0 = InitialValue0;]

...

[existing_fieldM = InitialValueM;]

[dynamic_field0 = InitialValue0;]

...

[dynamic_fieldN = InitialValueN;]

};

  • %var -- 用于存储该对象的句柄的变量,可通过它访问对象的成员变量和方法
  • new -- 创建对象的关键字
  • ObjectType -- 类名。在引擎中定义或者在script中定义的类,继承自SimObject或其子类。SimObject及其子类就是上面所谓的“游戏世界中的对象”。
  • Name(可选) -- 对象名称,同样可以用户访问对象。
  • CopySource(可选) -- script中已经定义了的某个对象的名字。所有固定属性(existing fields)的值都会从CopySource拷贝过来。所有动态属性(dynamic fields)都会自动在新对象中创建,并且把CopySource中的值全部拷贝过来。
  • arg0...argn(可选) -- 参数列表。
  • datablock -- 有些对象(从GameBase及其子类继承的类)要求一个datablock,用来初始化新对象的某些属性。
  • existing_fieldM -- 除使用datablock初始化属性外,还可以在这里初始化已存在的属性。
  • dynamic_fieldN -- 可以在这里给对象创建新的属性,这些属性仅仅在script中存在。在“世界编辑器”中他们现实为“dynamic fields”。

创建编译时未知的类型,可以使用eval()函数。比如:

eval("new %myObjectType(SomeObjectName);");

会根据%myObjectType的值来创建对象。

一些创建对象的代码示例:

// 创建一个SimObject对象,不改动任何属性

$example_object = new SimObject();

 

// 创建一个SimObject对象,同时添加一个动态属性

$example_object = new SimObject()

{ a_new_field = "Hello world!"; };

 

// 使用datablock来创建对象

datablock StaticShapeData(MyFirstDataBlock) {

 shapeFile = "~/data/shapes/player/player.dts";

 junkvar = "helloworld";

};

new StaticShape()

{

 dataBlock = "MyFirstDataBlock";

 position = "0.0 0.0 0.0";

 rotation = "1 0 0 0";

 scale = "1 1 1";

};

句柄(Handles)和名称(Names)

游戏中每一个对象都由两个参数定义和追踪:每个对象创建时有一个唯一的ID,就是句柄,也就是上面的%var,;名称是可选的Name。多数情况下,在调用对象时,二者可以互换,但必须注意:句柄是唯一的,而多个对象可以有相同的名字。

属性(Fields)和命令(Commands)

TorqueScript中的属性和命令就相当于C++的中成员(members)和函数(functions),也是C++一样,通过标准的“.”语法来调用。

动态属性

普通属性是某一个对象类型的所有实例都会有的属性,而动态属性则关联到某一个具体的对象。当你读一个不存在的属性时,仅仅会返回空字符串但是属性不会创建;但当你试图去写一个不存在的属性时,则会自动创建一个动态属性并赋值。

阅读(612) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~