Virtools的VSL脚本和底层SDK开发总结

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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()
{
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中的输入,输出和局部参数是受限制的。

当使用了其他的类型时候,就要使用指针类型,相应的开辟内存和释放内存,这一步要做好。

相关文档
最新文档