“Virtools 多重的工作方式 ( UI , VSL, SDK) ,确保非技术性的设计人员和高端的程序员, 聚集在 Virtools 工作环境中,群策群力,为一个共同的制作任务进行工作协作。”这是virtools官方介绍的一个句话。我就从这里开始。
UI即“GUI(Graphical User Interface ,人机交互图形化用户界面 ) ,以可视化的编辑方式,流程图的思维模式,进行对象和脚本设计工作,有效的减短了作品的制作周期。” 不好意思又抄了一句。UI的工作方式是为非技术性的设计人员所使用(即不懂任何程序的人员,只要有清楚的逻辑思维,就可以完成简单的工作)。而实际的项目中,很少存在简单的项目,简单的项目没钱赚。
“VSL全称是Virtools Scripting Language ,这个脚本语言以代码的方式,进行一部分的编程开发,优化脚本,提高效能”。和大多数脚本语言一样,VSL是个解析性语言。它类是c/c++语言,但有很多地方不同。对于基本的变量类型如bool、char、int、float、str都是占4 Bytes,这样的设计理念个人认为虽然导致了内存的消耗,但是提高程序的运行效率。它有60多个类和130多个数学函数,大部分类都是从Object类派生出来的,基本上能够完成大部分的功能,UI方式能做到的基本都能做到。但是正是因为VSL是解析性语言,所以适合写一些短小的功能,配合UI方式一起使用。VSL脚本语言不允许使用指针,不能定义指针变量,和大多数不允许使用指针的计算机语言一样,当进行参数传递时如果是int,float,bool等类型时,采用的是值传递方式,也就是说会copy这个值;如果以一个对象作为参数传递,那么传递的是这个对象的指针,而不会copy出一个对象出来。
VSL中使用了设计模式理念中的单一模式和工厂模式,所以使用上要遵循一定的规范,例如ActionContext类定义的ac对象和BehaviorContext类定义的bc对象是不能在多定义出一个的;当要创建一个3D实体时(如3DEntity对象)方式如下:
bc.CreateEntity3D(str iName,bool iDynamic,bool AddToCurrentScene);
删除是也要遵循工厂模式:
bc.DestroyObject(Object iObject,bool iDependencies);
在VSL全局变量的定义和使用有三种不同的情况,是容易混淆和出错的地方。
脚本一:
float c=0.0;
shared int a;
static float b;
void foo()
{
b+=c;
}
void main()
{
// Insert your code here
if (In) // iIn1 is a boolean global variable
{
a = 0;
}
else
{
++a;
}
b+=a;
foo();
c=b;
}
脚本二:
float c=0.0; //与脚本一的变量c不同变量;
shared int a; //和脚本一的变量a是同一个变量。
static float b;//与脚本一的变量b不同变量;
main()
{
a++;
b++;
c++;
}
1.float c=0.0;此变量的作用域仅在当前这个脚本范围内。在当前脚本中任何函数都可以修改它,但是当脚本运行完节退出以后,声明的这个变量将会释放掉。
2.shared int a;这个变量相当于c\c++里面的全局变量。在整个程序运行时一直有效,任何脚本都可以随时修改其只。
3.static float b;这个变量相当于在c\c++里面声明一个静态变量,当第二次运行调用函数时,该变量不会被重新定义,其值还在。但是不能被其他脚本所访问到。
这三点关系容易混淆,很多人都不清楚。虽然,帮助文档上有说明,但是很少人能够理解其中的意思。
Virtools 的 SDK 是一套软件开发工具 ,提供 Virtools 软件的所有底层函数 。 开发者可以使用它对 Virtools 引擎进行功能扩充和制作自定义的可执行应用程序。SDK开发出来的都是dll文件格式,开发的功能可分三类: 1.第一类是virtools本身的UI功能的扩充,可丰富可视化编辑方式。 2.第二类是开发新的manager类型。 3.第三类是开发新的Building Block(就是所谓的BB),这种方式使用得做多。 使用SDK开发新的BB,要说会说一大滩,但有一点要特别注意的,就是在声明变量的时候,绝对不要声明成全局变量。如下程序片段:
CKSTRING strUrl="这样做是不对的";
int Q_VTinputedit(const CKBehaviorContext& BehContext)
{
CKBehavior* beh = BehContext.Behavior;
CKContext *ctx=BehContext.Context; //当下个BB运行时候会更新strUrl此值。
strUrl=(CKSTRING)beh->GetInputParameterRead#Ptr(1);
return CKBR_OK;
} 这样导致的后果是,当程序中多次调用到这个BB时候,strUrl值就会更新为最后的值,而且计算机上运行的其他不相干的也是用virtools开发的进程会受影响。表面上这可以让BB之间和进程之间直接共享数据,但是这样是不规范的,会给项目中带来十分隐蔽的bug。
Virtools 的 SDK 是支持Win32和MFC的,要使用要包含相应的头文件。另外SDK中的输入,输出和局部参数是受限制的。当使用了其他的类型时候,就要使用指针类型,相应的开辟内存和释放内存,这一步要做好。
|