Virtools的VSL脚本和底层SDK开发总结
2008-08-17 17:58:49
    今天到新公司上班有一段时间了,使用的技能主要还是virtools。公司内部有报刊,一篇技术搞能捞个200多园,可以用来改善下伙食。happy,happy,我也来写一篇,希望能捞一小把。现在先到blog上写搞草稿,内容是《Virtools的VSL脚本和底层SDK开发总结》。关于virtools的种种我就不说了,现在网上多得是,谁有兴趣自己去搜吧。我只是总结一下个人的开发经验而已。
    “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()
sdk{
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中的输入,输出和局部参数是受限制的。当使用了其他的类型时候,就要使用指针类型,相应的开辟内存和释放内存,这一步要做好。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。